Analyzátory pro zpracování textu v Azure Cognitive Search

Analyzátor je součástí fulltextového vyhledávacího modulu, který zodpovídá 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í jiných než podstatných slov (slova stopwords) a interpunkce
  • Rozdělení frází a spojovníků na části komponent
  • Malá písmena a velká slova
  • Zmenšete slova na primitivní kořenové formy pro efektivitu úložiště, aby bylo možné najít shody bez ohledu na čas.

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

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

Typy dotazů, které nejsou fulltextové vyhledávání, jako jsou filtry nebo vyhledávání přibližných shod, nebudou procházet fází analýzy na straně dotazu. Místo toho analyzátor odesílá tyto řetězce přímo do vyhledávacího modulu pomocí vzoru, který poskytnete jako základ shody. Tyto formuláře dotazů obvykle vyžadují tokeny s celým řetězcem, aby porovnávání vzorů fungovalo. K zajištění celých termínů tokenů během indexování možná budete 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í v Azure Cognitive Search .

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

Výchozí analyzátor

V Azure Cognitive Search se analyzátor automaticky vyvolá pro všechna řetězcová pole označená jako prohledávatelná.

Ve výchozím Azure Cognitive Search používá analyzátor Apache Lucene Standard (standardní lucene),který rozdělí text na prvky následující po pravidlech "Segmentace textu Unicode". Standardní analyzátor navíc převede všechny znaky na jejich malá písmena. Indexované dokumenty i hledaný termín prochádí analýzu během indexování a zpracování dotazů.

Výchozí hodnotu můžete přepsat pro pole po poli. Alternativní analyzátory mohou být analyzátor jazyka pro lingvistické zpracování, vlastní analyzátor nebo integrovaný analyzátor ze seznamu dostupných analyzátorů.

Typy analyzátorů

Následující seznam popisuje, které analyzátory jsou k dispozici v Azure Cognitive Search.

Kategorie Popis
Standardní analyzátor Lucene Default (Výchozí). Není vyžadována žádná specifikace ani konfigurace. Tento analyzátor pro obecné účely dobře využívá mnoho jazyků a scénářů.
Integrované analyzátory Využívá se tak, jak je a odkazuje se na ně podle názvu. Existují dva typy: jazyk a jazyk.

Specializované analyzátory (bez jazyka) 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.

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

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

Jak určit analyzátory

Nastavení analyzátoru je volitelné. Obecně platí, že nejprve zkuste použít výchozí standardní analyzátor Lucene a podívejte se, jak to vypadá. Pokud dotazy nevrátí očekávané výsledky, je často správným řešením přepnutí na jiný analyzátor.

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

      "fields": [
     {
       "name": "Description",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "analyzer": "en.microsoft",
       "indexAnalyzer": null,
       "searchAnalyzer": null
     },
    

    Pokud používáte analyzátor jazyka, musíte k jeho zadání použít vlastnost analyzátoru. Vlastnosti searchAnalyzer a indexAnalyzer se nevztahují na analyzátory jazyka.

  2. Alternativně nastavte indexAnalyzer a searchAnalyzer, aby se analyzátor u jednotlivých úloh lichl. Tyto vlastnosti se nastavují společně a nahrazují vlastnost analyzátoru, která musí mít hodnotu null. K indexování a dotazům 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"
     },
    
  3. Pouze pro vlastní analyzátory vytvořte položku v oddílu [analyzers] indexu a pak přiřaďte vlastní analyzátor k definici pole podle jednoho z předchozích dvou kroků. Další informace najdete v tématu Vytvoření indexu a také Přidání vlastních analyzátorů.

Kdy přidat analyzátory

Nejlepší čas pro přidání a přiřazení analyzátorů je během aktivního vývoje, kdy je vyhazování a opětovné vytvoření indexů rutinní.

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

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

Pokud chcete do existujícího indexu přidat nové pole, zavolejte Update Index (Aktualizovat index), přidejte pole a příkaz mergeOrUpload ho naplňte.

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

Aktualizace indexu není povolená, protože by způsobila výpadky. Pokud chcete do existujícího indexu přidat nové analyzátory, tokenizátory, filtry tokenů nebo filtry znaků, nastavte v požadavku na aktualizaci indexu parametr dotazu allowIndexDowntime na hodnotu true. Všimněte si, že tato operace na několik sekund umisní index do offline režimu, což způsobí selhání indexování a požadavků na dotazy. Výkon a dostupnost zápisu indexu může být narušena několik minut po aktualizaci indexu nebo delší u velmi rozsáhlých indexů.

Recommendations pro práci s analyzátory

Tato část nabízí rady, jak pracovat s analyzátory.

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

Azure Cognitive Search umožňuje určit různé analyzátory pro indexování a vyhledávání prostřednictvím dalších vlastností indexAnalyzer a searchAnalyzer. Pokud není zadán, analyzátor nastavený s vlastností analyzátoru se použije pro indexování i vyhledávání. Pokud analyzátor neurčíte, použije se výchozí standardní analyzátor Lucene.

Obecným pravidlem je použít stejný analyzátor pro indexování i dotazování, pokud konkrétní požadavky neurčí jinak. Důkladně otestujte. Pokud se zpracování textu v době hledání a indexování liší, riskujete neshodu mezi termíny dotazu a indexovaných termínů, pokud 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 vrácení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 mezi výrazy vstupů dotazu a tokenizovanými výrazy v indexu. Pokud tokeny nejsou stejné, shoda se nedaří materializovat. Pokud chcete zkontrolovat výstup tokenizéru, doporučujeme použít rozhraní ANALYZE API jako nástroj pro šetření. Odpověď se skládá z tokenů generovaných konkrétním analyzátorem.

Příklady REST

Následující příklady ukazují definice analyzátorů 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ů jsou zadány samostatně jako pojmenované konstrukce a poté odkazovány v definici analyzátoru. Předdefinované prvky se používají tak, jak jsou, a jednoduše se na ně odkazuje pomocí názvu.

Projděte si tento příklad:

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

  • Vlastní analyzátor je součástí definice indexu. Může být trochu přizpůsobený (například přizpůsobení jedné možnosti v jednom filtru) nebo přizpůsobený na více místech.

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

  • Definuje také 2 vlastní filtry znaků "map_dash" a "remove_whitespace". První z nich nahradí všechny pomlčky podtržítkem, zatímco druhá odebere všechny mezery. V pravidlech mapování musí být mezery v kódování UTF-8. Filtry znaků se použijí před tokenizací a ovlivní výsledné tokeny (standardní tokenizér se zalomí na pomlčku 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 pro pole

Standardní analyzátor je výchozí. Předpokládejme, že chcete výchozí hodnotu nahradit jiným předdefinovaným analyzátorem, například analyzátorem vzorů. Pokud nenastavíte vlastní možnosti, budete je muset zadat pouze podle názvu v definici pole.

Element "analyzer" přepisuje standardní analyzátor na základě pole po poli. Neexistuje žádné globální přepsání. V tomto příkladu používá analyzátor vzorů a , který text1 text2 nezadá 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
        }
     ]
  }

Kombinace analyzátorů pro operace indexování a vyhledávání

Rozhraní API zahrnují další atributy indexu pro určení různých analyzátorů pro indexování a vyhledávání. Atributy searchAnalyzer a indexAnalyzer musí být zadány jako pár a nahradit atribut jednoho 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 mohou používat analyzátor jazyka, zatímco jiná pole si zachovávají výchozí hodnoty (nebo používají některé jiné předdefinované nebo vlastní analyzátory). 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, nemohou 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 v jazyce C#

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

Přiřazení analyzátoru jazyka

Každý analyzátor, který se používá tak, jak je, bez konfigurace, je zadán v definici pole. Vytvoření položky v oddílu [analyzers] indexu není nutné.

Analyzátory jazyka se používají tak, jak jsou. Pokud je chcete použít, zavolejte LexicalAnalyzera zadejte typ LexicalAnalyzerName, který poskytuje textový analyzátor podporovaný v Azure Cognitive Search.

Vlastní analyzátory jsou podobně zadané v definici pole, ale aby to fungovalo, musíte analyzátor zadat 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 se vyžaduje přizpůsobení nebo konfigurace, přidejte do indexu konstruktor analyzátoru. Jakmile ho definujete, můžete ho přidat do definice pole, jak je znázorněno v předchozím příkladu.

Vytvořte objekt CustomAnalyzer. Vlastní analyzátor je uživatelem definovaná kombinace známého tokenizéru, nulového nebo více filtru 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á uax_url_email tokenizer 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ší příklady najdete v souboru CustomAnalyzerTests.cs.

Další kroky

Podrobný popis spouštění dotazů najdete v části Fulltextové vyhledávání v Azure Cognitive Search. Článek používá příklady k vysvětlení chování, která se na povrchu mohou zdát netuchá.

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