Sdílet prostřednictvím


Analyzátory pro zpracování textu ve službě Azure AI Search

Analyzátor je součástí fulltextového vyhledávacího webu, který je zodpovědný za zpracování řetězců během indexování a provádění dotazů. Zpracování textu (označované také jako lexikální analýza) je transformativní a upravuje řetězec prostřednictvím akcí, jako jsou tyto:

  • Odebrání nevýznamných slov (stopwords) a interpunkce
  • Rozdělení frází a dělení slov na části součástí
  • Malá a velká písmena
  • Zmenšete slova do primitivních kořenových formulářů pro efektivitu úložiště, aby bylo možné najít shody bez ohledu na čas.

Analýza se vztahuje na Edm.String pole označená jako prohledávatelná, což označuje fulltextové vyhledávání.

U polí této konfigurace probíhá analýza během indexování při vytváření tokenů a při provádění dotazů, když se dotazy analyzují, a modul vyhledá odpovídající tokeny. Shoda bude pravděpodobně probíhat, když se stejný analyzátor používá pro indexování i dotazy, ale analyzátor pro každou úlohu můžete nastavit nezávisle v závislosti na vašich požadavcích.

Typy dotazů, které nejsou fulltextové vyhledávání, jako jsou filtry nebo přibližné vyhledávání, neprocházejí fází analýzy na straně dotazu. Analyzátor místo toho tyto řetězce odešle přímo do vyhledávacího webu pomocí vzoru, který zadáte jako základ shody. Tyto formuláře dotazu obvykle vyžadují tokeny celého řetězce, aby fungovaly porovnávání vzorů. Aby se zajistilo, že se během indexování zachovají celé tokeny termínů, budete možná potřebovat vlastní analyzátory. Další informace o tom, kdy a proč se analyzují termíny dotazů, najdete v tématu Fulltextové vyhledávání ve službě Azure AI Search.

Další informace o lexikální analýze najdete v následujícím videoklipu s stručným vysvětlením.

Výchozí analyzátor

Ve službě Azure AI Search se analyzátor automaticky vyvolá u všech řetězcových polí označených jako prohledávatelná.

Azure AI Search ve výchozím nastavení používá analyzátor Apache Lucene Standard (standard lucene), který rozdělí text na prvky, které následují v pravidlech Segmentace textu Unicode. Standardní analyzátor převede všechny znaky na jejich malá písmena. Indexované dokumenty i hledané termíny procházejí analýzou během indexování a zpracování dotazů.

Výchozí nastavení můžete přepsat pro pole po polích. Alternativní analyzátory jsou:

Typy analyzátorů

Následující seznam popisuje, které analyzátory jsou dostupné ve službě Azure AI Search.

Kategorie Popis
Standardní analyzátor Lucene Výchozí. Není vyžadována žádná specifikace ani konfigurace. Tento analyzátor pro obecné účely funguje dobře pro mnoho jazyků a scénářů.
Integrované analyzátory Využito tak, jak je, a odkazováno podle názvu. Existují dva typy: jazyk a jazyk nezávislý na jazyce.

Specializované analyzátory (nezávislé na jazyce) se používají, když textové vstupy vyžadují specializované zpracování nebo minimální zpracování. Mezi příklady analyzátorů v této kategorii patří Asciifolding, Keyword, Pattern, Simple, Stop, Whitespace.

Jazykové analyzátory se používají, když potřebujete bohatou jazykovou podporu pro jednotlivé jazyky. Azure AI Search podporuje 35 analyzátorů jazyka Lucene a 50 analyzátorů zpracování přirozeného jazyka Microsoftu.
Vlastní analyzátory Odkazuje na uživatelsky definovanou konfiguraci kombinace existujících prvků, která se skládá z jednoho tokenizátoru (povinné) a volitelných filtrů (znak nebo token).

Několik integrovaných analyzátorů, jako je model nebo zastavení, podporuje omezenou sadu možností konfigurace. Pokud chcete tyto možnosti nastavit, vytvořte vlastní analyzátor, který se skládá z integrovaného analyzátoru a jedné z alternativních možností zdokumentovaných v integrovaných analyzátorech. Stejně jako u jakékoli vlastní konfigurace zadejte novou konfiguraci s názvem, například myPatternAnalyzer , abyste ji odlišili od analyzátoru Lucene Pattern.

Určení analyzátorů

Nastavení analyzátoru je volitelné. Obecně platí, že nejprve zkuste použít výchozí standardní analyzátor Lucene, abyste zjistili, jak funguje. Pokud se dotazům nepodaří vrátit očekávané výsledky, přepnutí na jiný analyzátor je často správným řešením.

  1. Pokud používáte vlastní analyzátor, přidejte ho do indexu vyhledávání v části Analyzátor. Další informace najdete v tématu Vytvoření indexu a přidání vlastních analyzátorů.

  2. Při definování pole nastavte vlastnost "analyzer" na jednu z následujících možností: integrovaný analyzátor, jako je klíčové slovo, analyzátor jazyka, například en.microsoft, nebo vlastní analyzátor (definovaný ve stejném schématu indexu).

      "fields": [
     {
       "name": "Description",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "analyzer": "en.microsoft",
       "indexAnalyzer": null,
       "searchAnalyzer": null
     },
    
  3. Pokud používáte analyzátor jazyka, musíte k jeho zadání použít vlastnost "analyzer". Vlastnosti "searchAnalyzer" a "indexAnalyzer" se nevztahují na analyzátory jazyka.

  4. Případně můžete nastavit indexAnalyzer a searchAnalyzer tak, aby se analyzátor pro jednotlivé úlohy lišil. Tyto vlastnosti spolupracují jako náhrada vlastnosti "analyzer", která musí mít hodnotu null. Pro indexování a dotazy můžete použít různé analyzátory, pokud jedna z těchto aktivit vyžadovala konkrétní transformaci, kterou druhá nevyžaduje.

      "fields": [
     {
       "name": "ProductGroup",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "analyzer": null,
       "indexAnalyzer": "keyword",
       "searchAnalyzer": "standard"
     },
    

Kdy přidat analyzátory

Nejlepší doba, kdy přidat a přiřadit analyzátory, je během aktivního vývoje, při vyřazení a opětovném vytvoření indexů je rutinní.

Vzhledem k tomu, že analyzátory se používají k tokenizaci termínů, měli byste při vytváření pole přiřadit analyzátor. Ve skutečnosti přiřazení analyzátoru nebo indexAnalyzer k poli, které již bylo fyzicky vytvořeno, není povoleno (ačkoli vlastnost searchAnalyzer můžete kdykoli změnit bez dopadu na index).

Pokud chcete změnit analyzátor existujícího pole, budete muset odstranit a znovu vytvořit celý index (nemůžete znovu sestavit jednotlivá pole). U indexů v produkčním prostředí můžete odložit opětovné sestavení vytvořením nového pole s novým přiřazením analyzátoru a začít ho používat místo starého. Pomocí funkce Update Index začleníte nové pole a mergeOrUpload ho naplníte. Později můžete v rámci plánované údržby indexů vyčistit index a odebrat zastaralá pole.

Pokud chcete přidat nové pole do existujícího indexu, zavolejte update Index , aby se toto pole přidalo, a mergeOrUpload ho naplňte.

Pokud chcete do existujícího indexu přidat vlastní analyzátor, předejte příznak allowIndexDowntime v indexu aktualizace, pokud se chcete této chybě vyhnout:

"Index update not allowed because it would cause downtime. In order to add new analyzers, tokenizers, token filters, or character filters to an existing index, set the 'allowIndexDowntime' query parameter to 'true' in the index update request. Note that this operation will put your index offline for at least a few seconds, causing your indexing and query requests to fail. Performance and write availability of the index can be impaired for several minutes after the index is updated, or longer for very large indexes."

Doporučení pro práci s analyzátory

Tato část obsahuje rady, jak pracovat s analyzátory.

Jeden analyzátor pro čtení i zápis, pokud nemáte specifické požadavky

Azure AI Search umožňuje zadat různé analyzátory pro indexování a prohledávat vlastnosti pole "indexAnalyzer" a "searchAnalyzer". Pokud není zadaný, sada analyzátoru s vlastností analyzátoru se používá pro indexování i vyhledávání. Pokud není analyzátor zadaný, použije se výchozí standardní analyzátor Lucene.

Obecné pravidlo je použít stejný analyzátor pro indexování i dotazování, pokud konkrétní požadavky diktují jinak. Nezapomeňte důkladně testovat. Pokud se zpracování textu při hledání a indexování liší, riskujete neshodu mezi termíny dotazu a indexovanými termíny, když konfigurace analyzátoru vyhledávání a indexování nejsou zarovnané.

Testování během aktivního vývoje

Přepsání standardního analyzátoru vyžaduje opětovné sestavení indexu. Pokud je to možné, před uvedením indexu do produkčního prostředí se rozhodněte, které analyzátory se mají použít během aktivního vývoje.

Kontrola tokenizovaných termínů

Pokud hledání nevrátí očekávané výsledky, nejpravděpodobnějším scénářem jsou nesrovnalosti tokenů mezi vstupy termínů v dotazu a tokenizovanými termíny v indexu. Pokud tokeny nejsou stejné, shoda se nepodaří materializovat. Pokud chcete zkontrolovat výstup tokenizátoru, doporučujeme použít rozhraní API pro analýzu jako nástroj pro šetření. Odpověď se skládá z tokenů vygenerovaných konkrétním analyzátorem.

Příklady REST

Následující příklady ukazují definice analyzátoru pro několik klíčových scénářů.

Příklad vlastního analyzátoru

Tento příklad znázorňuje definici analyzátoru s vlastními možnostmi. Vlastní možnosti pro filtry znaků, tokenizátory a filtry tokenů se zadají samostatně jako pojmenované konstrukty a následně odkazují v definici analyzátoru. Předdefinované prvky se používají tak, jak jsou, a odkazují na je podle názvu.

Projděte si tento příklad:

  • Analyzátory jsou vlastností třídy pole pro prohledávatelné pole.

  • Vlastní analyzátor je součástí definice indexu. Může se mírně přizpůsobit (například přizpůsobit jednu možnost v jednom filtru) nebo přizpůsobit na více místech.

  • V tomto případě je vlastní analyzátor "my_analyzer", který zase používá přizpůsobený standardní tokenizátor "my_standard_tokenizer" a dva filtry tokenů: malá a přizpůsobená filtr asciifolding "my_asciifolding".

  • Definuje také 2 vlastní filtry znaků "map_dash" a "remove_whitespace". První nahradí všechny pomlčky podtržítkami, zatímco druhý odebere všechny mezery. V pravidlech mapování musí být zakódované mezery UTF-8. Filtry znaků se použijí před tokenizací a ovlivní výsledné tokeny (standardní tokenizátor se přeruší na přerušované pomlce a mezerách, ale ne na podtržítku).

  {
     "name":"myindex",
     "fields":[
        {
           "name":"id",
           "type":"Edm.String",
           "key":true,
           "searchable":false
        },
        {
           "name":"text",
           "type":"Edm.String",
           "searchable":true,
           "analyzer":"my_analyzer"
        }
     ],
     "analyzers":[
        {
           "name":"my_analyzer",
           "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
           "charFilters":[
              "map_dash",
              "remove_whitespace"
           ],
           "tokenizer":"my_standard_tokenizer",
           "tokenFilters":[
              "my_asciifolding",
              "lowercase"
           ]
        }
     ],
     "charFilters":[
        {
           "name":"map_dash",
           "@odata.type":"#Microsoft.Azure.Search.MappingCharFilter",
           "mappings":["-=>_"]
        },
        {
           "name":"remove_whitespace",
           "@odata.type":"#Microsoft.Azure.Search.MappingCharFilter",
           "mappings":["\\u0020=>"]
        }
     ],
     "tokenizers":[
        {
           "name":"my_standard_tokenizer",
           "@odata.type":"#Microsoft.Azure.Search.StandardTokenizerV2",
           "maxTokenLength":20
        }
     ],
     "tokenFilters":[
        {
           "name":"my_asciifolding",
           "@odata.type":"#Microsoft.Azure.Search.AsciiFoldingTokenFilter",
           "preserveOriginal":true
        }
     ]
  }

Příklad přiřazení analyzátoru polí

Standardní analyzátor je výchozí hodnota. Předpokládejme, že chcete výchozí hodnotu nahradit jiným předdefinovaným analyzátorem, například analyzátorem vzoru. Pokud nenastavujete vlastní možnosti, stačí je zadat jenom podle názvu v definici pole.

Element "analyzer" přepíše analyzátor Standard na základě pole po poli. Neexistuje žádné globální přepsání. V tomto příkladu text1 používá analyzátor vzorů, text2který nezadává analyzátor, používá výchozí hodnotu.

  {
     "name":"myindex",
     "fields":[
        {
           "name":"id",
           "type":"Edm.String",
           "key":true,
           "searchable":false
        },
        {
           "name":"text1",
           "type":"Edm.String",
           "searchable":true,
           "analyzer":"pattern"
        },
        {
           "name":"text2",
           "type":"Edm.String",
           "searchable":true
        }
     ]
  }

Kombinování analyzátorů pro indexování a vyhledávací operace

Rozhraní API obsahují atributy indexu pro zadání různých analyzátorů pro indexování a vyhledávání. Atributy searchAnalyzer a indexAnalyzer musí být zadány jako pár, přičemž nahradí jeden atribut analyzátoru.

  {
     "name":"myindex",
     "fields":[
        {
           "name":"id",
           "type":"Edm.String",
           "key":true,
           "searchable":false
        },
        {
           "name":"text",
           "type":"Edm.String",
           "searchable":true,
           "indexAnalyzer":"whitespace",
           "searchAnalyzer":"simple"
        },
     ],
  }

Příklad analyzátoru jazyka

Pole obsahující řetězce v různých jazycích můžou používat analyzátor jazyka, zatímco jiná pole zachovají výchozí hodnotu (nebo používají jiný předdefinovaný nebo vlastní analyzátor). Pokud používáte analyzátor jazyka, musí se použít pro operace indexování i vyhledávání. Pole, která používají analyzátor jazyka, nemůžou mít různé analyzátory pro indexování a vyhledávání.

  {
     "name":"myindex",
     "fields":[
        {
           "name":"id",
           "type":"Edm.String",
           "key":true,
           "searchable":false
        },
        {
           "name":"text",
           "type":"Edm.String",
           "searchable":true,
           "indexAnalyzer":"whitespace",
           "searchAnalyzer":"simple"
        },
        {
           "name":"text_fr",
           "type":"Edm.String",
           "searchable":true,
           "analyzer":"fr.lucene"
        }
     ],
  }

Příklady jazyka C#

Pokud používáte ukázky kódu sady .NET SDK, můžete tyto příklady připojit k použití nebo konfiguraci analyzátorů.

Přiřazení analyzátoru jazyka

Každý analyzátor, který se používá tak, jak je, bez konfigurace, se zadává v definici pole. Není nutné vytvořit položku v části [analyzátory] indexu.

Analyzátory jazyka se používají tak, jak jsou. Pokud je chcete použít, zavolejte LexicalAnalyzer a zadejte typ LexicalAnalyzerName , který poskytuje textový analyzátor podporovaný ve službě Azure AI Search.

Vlastní analyzátory jsou podobně zadané v definici pole, ale aby to fungovalo, musíte zadat analyzátor v definici indexu, jak je popsáno v další části.

    public partial class Hotel
    {
       . . . 
        [SearchableField(AnalyzerName = LexicalAnalyzerName.Values.EnLucene)]
        public string Description { get; set; }

        [SearchableField(AnalyzerName = LexicalAnalyzerName.Values.FrLucene)]
        [JsonPropertyName("Description_fr")]
        public string DescriptionFr { get; set; }

        [SearchableField(AnalyzerName = "url-analyze")]
        public string Url { get; set; }
      . . .
    }

Definování vlastního analyzátoru

Pokud je požadováno přizpůsobení nebo konfigurace, přidejte do indexu konstruktor analyzátoru. Jakmile ji definujete, můžete ji přidat jako definici pole, jak je znázorněno v předchozím příkladu.

Vytvořte objekt CustomAnalyzer . Vlastní analyzátor je uživatelsky definovaná kombinace známého tokenizátoru, nulového nebo více filtrů tokenů a nulových nebo více názvů filtrů znaků:

Následující příklad vytvoří vlastní analyzátor s názvem url-analyze, který používá tokenizátor uax_url_email a filtr tokenů malými písmeny.

private static void CreateIndex(string indexName, SearchIndexClient adminClient)
{
   FieldBuilder fieldBuilder = new FieldBuilder();
   var searchFields = fieldBuilder.Build(typeof(Hotel));

   var analyzer = new CustomAnalyzer("url-analyze", "uax_url_email")
   {
         TokenFilters = { TokenFilterName.Lowercase }
   };

   var definition = new SearchIndex(indexName, searchFields);

   definition.Analyzers.Add(analyzer);

   adminClient.CreateOrUpdateIndex(definition);
}

Další kroky

Podrobný popis provádění dotazů najdete v fulltextovém vyhledávání ve službě Azure AI Search. Tento článek používá příklady k vysvětlení chování, které se na povrchu můžou zdát neintuitivní.

Další informace o analyzátorech najdete v následujících článcích: