Szövegfeldolgozási elemzők az Azure AI Searchben

Az elemző a teljes szöveges keresőmotor összetevője, amely a sztringek indexelés és lekérdezés végrehajtása során történő feldolgozásáért felelős. A szövegfeldolgozás (más néven lexikális elemzés) átalakító, amely a sztringeket az alábbi műveleteken keresztül módosítja:

  • Nem alapvető szavak (stopwords) és írásjelek eltávolítása
  • Kifejezések és elválasztott szavak felosztása összetevőkre
  • Kisbetűs szó
  • Csökkentse a szavakat primitív gyökérűrlapokká a tárolási hatékonyság érdekében, hogy a találatok a feszült állapottól függetlenül is megtalálhatók legyenek

Az elemzés a "kereshetőként" megjelölt mezőkre Edm.String vonatkozik, amely a teljes szöveges keresést jelzi.

A konfiguráció mezői esetében az elemzés az indexelés során történik a jogkivonatok létrehozásakor, majd a lekérdezés végrehajtása során, amikor a lekérdezések elemzésre kerülnek, és a motor egyező jogkivonatokat keres. Nagyobb valószínűséggel fordul elő egyezés, ha ugyanazt az elemzőt használja az indexeléshez és a lekérdezésekhez is, de az elemzőt egymástól függetlenül is beállíthatja az egyes számítási feladatokhoz a követelményektől függően.

A nem teljes szöveges kereséssel (például szűrőkkel vagy homályos kereséssel) kapcsolatos lekérdezéstípusok nem haladnak át a lekérdezés oldalán az elemzési fázison. Ehelyett az elemző közvetlenül a keresőmotornak küldi el ezeket a sztringeket az Ön által megadott minta alapján. Ezek a lekérdezési űrlapok általában egész sztringes jogkivonatokat igényelnek a mintaegyeztetés működéséhez. Ahhoz, hogy a teljes kifejezés jogkivonatai megmaradjanak az indexelés során, szükség lehet egyéni elemzőkre. További információ a lekérdezési kifejezések elemzésének időpontjáról és okáról: Teljes szöveges keresés az Azure AI Searchben.

A lexikális elemzéssel kapcsolatos további háttérért hallgassa meg a következő videoklipet egy rövid magyarázatért.

Alapértelmezett elemző

Az Azure AI Searchben a rendszer automatikusan meghív egy elemzőt a kereshetőként megjelölt összes sztringmezőre.

Az Azure AI Search alapértelmezés szerint az Apache Lucene Standard elemzőt (standard lucene) használja, amely a szöveget a "Unicode Text Szegmentálás" szabályok szerinti elemekre bontja. A standard elemző az összes karaktert kisbetűs formává alakítja. Az indexelt dokumentumok és a keresési kifejezések egyaránt végighaladnak az elemzésen az indexelés és a lekérdezésfeldolgozás során.

Az alapértelmezett értéket mezőnként felülbírálhatja. Az alternatív elemzők lehetnek nyelvi feldolgozáshoz használható nyelvelemzők , egyéni elemzők vagy beépített elemzők az elérhető elemzők listájából.

Az elemzők típusai

Az alábbi lista ismerteti, hogy mely elemzők érhetők el az Azure AI Searchben.

Kategória Leírás
Standard Lucene-elemző Default (Alapértelmezett): Nincs szükség specifikációra vagy konfigurációra. Ez az általános célú elemző számos nyelv és forgatókönyv esetében jól működik.
Beépített elemzők Használatban van, és név alapján hivatkozik gombra. Két típus létezik: nyelv és nyelv-agnosztikus.

Speciális (nyelvi-agnosztikus) elemzőket akkor használunk, ha a szöveges bemenetek speciális feldolgozást vagy minimális feldolgozást igényelnek. Az ebben a kategóriában szereplő elemzők közé tartoznak például az Asciifolding, a Kulcsszó, a Minta, az Egyszerű, a Stop, a Whitespace.

A nyelvelemzők akkor használatosak, ha az egyes nyelvekhez gazdag nyelvi támogatásra van szüksége. Az Azure AI Search 35 Lucene nyelvelemzőt és 50 Természetes nyelvi feldolgozást elemző Microsoft-felhasználót támogat.
Egyéni elemzők A meglévő elemek kombinációjának felhasználó által definiált konfigurációjára hivatkozik, amely egy tokenizerből (kötelező) és választható szűrőkből (karakterből vagy jogkivonatból) áll.

Néhány beépített elemző, például a Minta vagy a Leállítás, korlátozott konfigurációs lehetőségeket támogat. A beállítások beállításához hozzon létre egy egyéni elemzőt, amely a beépített elemzőből és a beépített elemzőkben dokumentált alternatív lehetőségek egyikéből áll. Az egyéni konfigurációkhoz hasonlóan adjon nevet az új konfigurációnak, például a myPatternAnalyzernek , hogy megkülönböztesse a Lucene-mintaelemzőtől.

Elemzők megadása

Az elemző beállítása nem kötelező. Általános szabályként először próbálja meg az alapértelmezett standard Lucene-elemzőt használni a teljesítmény megtekintéséhez. Ha a lekérdezések nem adják vissza a várt eredményeket, gyakran egy másik elemzőre való váltás a megfelelő megoldás.

  1. Ha egyéni elemzőt használ, vegye fel a keresési indexbe az "elemző" szakaszban. További információ: Index létrehozása és egyéni elemzők hozzáadása.

  2. Mező definiálásakor állítsa be az "analyzer" tulajdonságot a következők egyikére: beépített elemzőre , például kulcsszóra, nyelvelemzőre , például en.microsoftegy egyéni elemzőre (ugyanabban az indexsémában definiálva).

      "fields": [
     {
       "name": "Description",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "analyzer": "en.microsoft",
       "indexAnalyzer": null,
       "searchAnalyzer": null
     },
    
  3. Ha nyelvelemzőt használ, annak megadásához az "analyzer" tulajdonságot kell használnia. A "searchAnalyzer" és az "indexAnalyzer" tulajdonságok nem vonatkoznak a nyelvelemzőkre.

  4. Másik lehetőségként állítsa be az "indexAnalyzer" és a "searchAnalyzer" értéket, hogy az egyes számítási feladatokhoz eltérő elemzőt állítson be. Ezek a tulajdonságok az "analyzer" tulajdonság helyettesítőjeként működnek együtt, amelynek null értékűnek kell lennie. Az indexeléshez és lekérdezésekhez különböző elemzőket használhat, ha az egyik tevékenységhez nem szükséges egy adott átalakítás.

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

Mikor kell elemzőket hozzáadni?

Az elemzők hozzáadásának és hozzárendelésének legjobb ideje az aktív fejlesztés során, az indexek elvetése és újraépítése rutinszerű.

Mivel az elemzők a kifejezések tokenizálására szolgálnak, a mező létrehozásakor ki kell osztania egy elemzőt. Valójában nem engedélyezett egy elemző vagy indexAnalyzer hozzárendelése olyan mezőhöz, amely már fizikailag lett létrehozva (bár a searchAnalyzer tulajdonságot bármikor módosíthatja, és nincs hatással az indexre).

Egy meglévő mező elemzőjének módosításához le kell dobnia és újra létre kell hoznia a teljes indexet (az egyes mezőket nem lehet újraépíteni). Éles indexek esetén elhalaszthatja az újraépítést úgy, hogy létrehoz egy új mezőt az új elemző-hozzárendeléssel, és elkezdi használni a régi helyett. Az Index frissítése funkcióval beépítheti az új mezőt, és a mergeOrUpload segítségével feltöltheti azt. Később a tervezett indexkarbantartás részeként törölheti az indexet az elavult mezők eltávolításához.

Ha új mezőt szeretne hozzáadni egy meglévő indexhez, hívja meg az Index frissítése parancsot a mező hozzáadásához, és a mergeOrUpload egyesítésével töltse ki.

Ha egyéni elemzőt szeretne hozzáadni egy meglévő indexhez, adja meg az "allowIndexDowntime" jelzőt az Index frissítése területen, ha el szeretné kerülni ezt a hibát:

"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."

Javaslatok az elemzőkkel való munkához

Ez a szakasz tanácsokat nyújt az elemzőkkel való munkához.

Egy elemző írás-olvasáshoz, kivéve, ha konkrét követelményekkel rendelkezik

Az Azure AI Search lehetővé teszi, hogy különböző elemzőket adjon meg az indexeléshez és a kereséshez az "indexAnalyzer" és a "searchAnalyzer" mező tulajdonságain keresztül. Ha nincs meghatározva, a rendszer az elemző tulajdonsággal rendelkező elemzőt használja az indexeléshez és a kereséshez is. Ha az elemző nincs meghatározva, a rendszer az alapértelmezett Standard Lucene-elemzőt használja.

Általános szabály, hogy ugyanazt az elemzőt használja mind az indexeléshez, mind a lekérdezéshez, kivéve, ha adott követelmények másként rendelkeznek. Ügyeljen arra, hogy alaposan tesztelje. Ha a szövegfeldolgozás a keresési és indexelési időpontban eltérő, akkor fennáll a lekérdezési kifejezések és az indexelt kifejezések közötti eltérés kockázata, ha a keresési és indexelési elemző konfigurációi nem igazodnak egymáshoz.

Tesztelés az aktív fejlesztés során

A standard elemző felülbírálása index-újraépítést igényel. Ha lehetséges, döntse el, hogy mely elemzőket használja az aktív fejlesztés során, mielőtt üzembe helyez egy indexet az éles környezetben.

Jogkivonatos kifejezések vizsgálata

Ha a keresés nem adja vissza a várt eredményeket, a legvalószínűbb forgatókönyv a lekérdezés kifejezésbemenetei és az index tokenizált kifejezései közötti eltérés. Ha a jogkivonatok nem azonosak, az egyezések nem valósulnak meg. A tokenizer kimenetének vizsgálatához javasoljuk, hogy az Analyze API-t használja vizsgálati eszközként. A válasz egy adott elemző által létrehozott jogkivonatokból áll.

REST-példák

Az alábbi példák néhány kulcsfontosságú forgatókönyv elemződefinícióit mutatják be.

Egyéni elemző példa

Ez a példa egy egyéni beállításokkal rendelkező elemződefiníciót mutat be. A karakterszűrők, tokenizerek és jogkivonatszűrők egyéni beállításai nevesített szerkezetként vannak megadva, majd az elemző definíciójában hivatkoznak rá. Az előre definiált elemek használatban vannak, és név alapján hivatkoznak gombra.

A példa végigjárása:

  • Az elemzők a kereshető mezők mezőosztályának tulajdonságai.

  • Az egyéni elemző egy indexdefiníció része. Ez lehet könnyedén testre szabva (például egyetlen beállítás testreszabása egy szűrőben) vagy több helyen testre szabva.

  • Ebben az esetben az egyéni elemző a "my_analyzer", amely viszont egy testre szabott szabványos "my_standard_tokenizer" tokenizert és két jogkivonatszűrőt használ: kisbetűs és testre szabott asciifolding szűrőt "my_asciifolding".

  • Emellett 2 egyéni karakterszűrőt is definiál a "map_dash" és a "remove_whitespace". Az első az összes kötőjelet aláhúzásjelekre cseréli, míg a második az összes szóközt eltávolítja. A szóközöknek UTF-8 kódolásúnak kell lenniük a leképezési szabályokban. A karakterszűrők a jogkivonatok létrehozása előtt kerülnek alkalmazásra, és hatással lesznek az eredményül kapott jogkivonatokra (a normál jogkivonat-kötőjeleken és szóközökön nem, de aláhúzásjelen nem).

  {
     "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
        }
     ]
  }

Mezőnkénti elemző-hozzárendelési példa

A Standard elemző az alapértelmezett. Tegyük fel, hogy egy másik előre definiált elemzőre, például a mintaelemzőre szeretné cserélni az alapértelmezett értéket. Ha nem egyéni beállításokat ad meg, csak név szerint kell megadnia a meződefinícióban.

Az "elemző" elem mezőnként felülbírálja a Standard elemzőt. Nincs globális felülbírálás. Ebben a példában a mintaelemzőt használja, text1 és text2– amely nem ad meg elemzőt – az alapértelmezettet használja.

  {
     "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
        }
     ]
  }

Elemzők keverése indexelési és keresési műveletekhez

Az API-k indexattribútumokat tartalmaznak a különböző elemzők indexeléshez és kereséshez való megadásához. A searchAnalyzer és az indexAnalyzer attribútumokat párként kell megadni, lecserélve az egyetlen elemző attribútumot.

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

Példa nyelvelemzőre

A különböző nyelveken sztringeket tartalmazó mezők használhatnak nyelvelemzőt, míg más mezők megtartják az alapértelmezett értéket (vagy más előre definiált vagy egyéni elemzőt használnak). Ha nyelvelemzőt használ, az indexeléshez és a keresési műveletekhez egyaránt használható. A nyelvelemzőt használó mezők nem rendelkezhetnek különböző elemzőkkel az indexeléshez és a kereséshez.

  {
     "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"
        }
     ],
  }

C#-példák

Ha a .NET SDK-kódmintákat használja, ezeket a példákat hozzáfűzheti az elemzők használatához vagy konfigurálásához.

Nyelvelemző hozzárendelése

Minden olyan elemző, amely konfigurálással nem rendelkezik, egy meződefinícióban van megadva. Nincs szükség bejegyzés létrehozására az index [elemzők] szakaszában.

A nyelvelemzők használatban vannak. A használatukhoz hívja meg a LexicalAnalyzert, és adja meg a LexicalAnalyzerName típust, és adjon meg egy, az Azure AI Searchben támogatott szövegelemzőt.

Az egyéni elemzők hasonlóan vannak megadva a meződefinícióban, de ahhoz, hogy ez működjön, meg kell adnia az elemzőt az indexdefinícióban, a következő szakaszban leírtak szerint.

    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; }
      . . .
    }

Egyéni elemző definiálása

Ha testreszabásra vagy konfigurálásra van szükség, adjon hozzá egy elemzőszerkezetet egy indexhez. Miután definiálta, hozzáadhatja a meződefiníciót az előző példában bemutatott módon.

Hozzon létre egy CustomAnalyzer-objektumot . Az egyéni elemző egy ismert tokenizer, nulla vagy több jogkivonatszűrő és nulla vagy több karakterszűrő neve felhasználó által definiált kombinációja:

Az alábbi példa egy "url-analyze" nevű egyéni elemzőt hoz létre, amely a uax_url_email tokenizert és a kisbetűs jogkivonat-szűrőt használja.

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);
}

Következő lépések

A lekérdezések végrehajtásának részletes leírása az Azure AI Search teljes szöveges keresésében található. A cikk példákat használ az olyan viselkedések magyarázatára, amelyek a felszínen ellentétesen intuitívnak tűnhetnek.

Az elemzőkkel kapcsolatos további információkért tekintse meg az alábbi cikkeket: