Analysemogelijkheden voor tekstverwerking in Azure AI Search

Een analyse is een onderdeel van de zoekprogramma voor volledige tekst dat verantwoordelijk is voor het verwerken van tekenreeksen tijdens het indexeren en uitvoeren van query's. Tekstverwerking (ook wel lexicale analyse genoemd) is transformatief en wijzigt een tekenreeks via acties zoals deze:

  • Niet-essentiële woorden (stopwoorden) en interpunctie verwijderen
  • Woordgroepen en afbreekstreepjes opsplitsen in onderdeelonderdelen
  • Kleine letters voor hoofdletters
  • Verminder woorden in primitieve hoofdformulieren voor opslagefficiëntie en zodat overeenkomsten kunnen worden gevonden, ongeacht de gespannenheid

Analyse is van toepassing op Edm.String velden die zijn gemarkeerd als 'doorzoekbaar', wat aangeeft dat zoeken in volledige tekst wordt aangegeven.

Voor velden van deze configuratie vindt analyse plaats tijdens het indexeren wanneer tokens worden gemaakt en vervolgens opnieuw tijdens het uitvoeren van query's wanneer query's worden geparseerd en de engine scant op overeenkomende tokens. Een overeenkomst is waarschijnlijker wanneer dezelfde analyse wordt gebruikt voor zowel indexering als query's, maar u kunt de analyse voor elke workload onafhankelijk instellen, afhankelijk van uw vereisten.

Querytypen die geen zoekopdracht in volledige tekst zijn, zoals filters of fuzzy zoekopdrachten, doorlopen niet de analysefase aan de queryzijde. In plaats daarvan verzendt de parser deze tekenreeksen rechtstreeks naar de zoekmachine, met behulp van het patroon dat u opgeeft als basis voor de overeenkomst. Normaal gesproken zijn voor deze queryformulieren tokens met gehele tekenreeksen vereist om patroonkoppelingen te maken. Om ervoor te zorgen dat tokens voor hele termen behouden blijven tijdens het indexeren, hebt u mogelijk aangepaste analyses nodig. Zie Zoeken in volledige tekst in Azure AI Search voor meer informatie over wanneer en waarom querytermen worden geanalyseerd.

Luister naar de volgende videoclip voor een korte uitleg voor meer achtergrondinformatie over lexicale analyses.

Standaardanalyse

In Azure AI Search wordt automatisch een analyse aangeroepen voor alle tekenreeksvelden die zijn gemarkeerd als doorzoekbaar.

Azure AI Search maakt standaard gebruik van de Apache Lucene Standard Analyzer (standaard lucene), waarmee tekst wordt opgesplitst in elementen volgens de regels 'Unicode Text Segmentation' . De standaardanalyse converteert alle tekens naar de kleine letters. Zowel geïndexeerde documenten als zoektermen doorlopen de analyse tijdens het indexeren en het verwerken van query's.

U kunt de standaardwaarde per veld overschrijven. Alternatieve analysemogelijkheden kunnen een taalanalyse zijn voor taalkundige verwerking, een aangepaste analyse of een ingebouwde analyse uit de lijst met beschikbare analyses.

Typen analysen

In de volgende lijst wordt beschreven welke analyses beschikbaar zijn in Azure AI Search.

Categorie Beschrijving
Standard Lucene Analyzer Standaard. Er is geen specificatie of configuratie vereist. Deze analyse voor algemeen gebruik presteert goed voor veel talen en scenario's.
Ingebouwde analyses Gebruikt als is en waarnaar wordt verwezen op naam. Er zijn twee typen: taal en taalneutraal.

Gespecialiseerde (taalagnostische) analyseanalyses worden gebruikt wanneer voor tekstinvoer speciale verwerking of minimale verwerking is vereist. Voorbeelden van analyses in deze categorie zijn Asciifolding, Keyword, Pattern, Simple, Stop, Whitespace.

Taalanalyses worden gebruikt wanneer u uitgebreide taalkundige ondersteuning nodig hebt voor afzonderlijke talen. Azure AI Search ondersteunt 35 Lucene-taalanalyses en 50 Microsoft-analyseanalyses voor natuurlijke taal.
Analysevoorzieningen aanpassen Verwijst naar een door de gebruiker gedefinieerde configuratie van een combinatie van bestaande elementen, bestaande uit één tokenizer (vereist) en optionele filters (char of token).

Een aantal ingebouwde analyses, zoals Patroon of Stoppen, ondersteunen een beperkte set configuratieopties. Als u deze opties wilt instellen, maakt u een aangepaste analyse, bestaande uit de ingebouwde analyse en een van de alternatieve opties die worden beschreven in ingebouwde analyseprogramma's. Net als bij elke aangepaste configuratie moet u uw nieuwe configuratie voorzien van een naam, zoals myPatternAnalyzer om deze te onderscheiden van de Lucene Pattern Analyzer.

Analyseanalyses opgeven

Het instellen van een analyse is optioneel. Probeer als algemene regel eerst de standaard Lucene Analyzer te gebruiken om te zien hoe deze presteert. Als query's de verwachte resultaten niet retourneren, is overschakelen naar een andere analyse vaak de juiste oplossing.

  1. Als u een aangepaste analyse gebruikt, voegt u deze toe aan de zoekindex onder de sectie Analyse. Zie Index maken en aangepaste analysefuncties toevoegen voor meer informatie.

  2. Wanneer u een veld definieert, stelt u de eigenschap 'analyse' in op een van de volgende: een ingebouwde analyse , zoals trefwoord, een taalanalyse zoals en.microsoft, of een aangepaste analyse (gedefinieerd in hetzelfde indexschema).

      "fields": [
     {
       "name": "Description",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "analyzer": "en.microsoft",
       "indexAnalyzer": null,
       "searchAnalyzer": null
     },
    
  3. Als u een taalanalyse gebruikt, moet u de eigenschap Analyse gebruiken om deze op te geven. De eigenschappen searchAnalyzer en IndexAnalyzer zijn niet van toepassing op taalanalyses.

  4. U kunt ook 'indexAnalyzer' en 'searchAnalyzer' instellen om de analyse voor elke workload te variëren. Deze eigenschappen werken samen als vervanging voor de eigenschap analyse, die null moet zijn. U kunt verschillende analysefuncties gebruiken voor het indexeren en uitvoeren van query's als een van deze activiteiten een specifieke transformatie vereist die niet nodig is voor de andere.

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

Wanneer moet ik analyses toevoegen?

De beste tijd om analyses toe te voegen en toe te wijzen, is tijdens de actieve ontwikkeling, wanneer indexen worden verwijderd en opnieuw worden gegenereerd, routine is.

Omdat analyses worden gebruikt om termen te tokeniseren, moet u een analyse toewijzen wanneer het veld wordt gemaakt. Het toewijzen van een analyse of indexAnalyzer aan een veld dat al fysiek is gemaakt, is zelfs niet toegestaan (hoewel u de eigenschap searchAnalyzer op elk gewenst moment kunt wijzigen zonder dat dit van invloed is op de index).

Als u de analyse van een bestaand veld wilt wijzigen, moet u de hele index verwijderen en opnieuw maken (u kunt afzonderlijke velden niet opnieuw opbouwen). Voor indexen in productie kunt u een herbouw uitstellen door een nieuw veld te maken met de nieuwe analysetoewijzing en deze te gebruiken in plaats van de oude. Gebruik Update-index om het nieuwe veld op te nemen en mergeOrUpload te vullen. Later kunt u, als onderdeel van gepland indexonderhoud, de index opschonen om verouderde velden te verwijderen.

Als u een nieuw veld wilt toevoegen aan een bestaande index, roept u Update-index aan om het veld toe te voegen en mergeOrUpload om het te vullen.

Als u een aangepaste analyse wilt toevoegen aan een bestaande index, geeft u de vlag allowIndexDowntime door in Update Index als u deze fout wilt voorkomen:

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

Aanbevelingen voor het werken met analyse

In deze sectie vindt u advies over het werken met analyses.

Eén analyse voor lezen/schrijven, tenzij u specifieke vereisten hebt

Met Azure AI Search kunt u verschillende analysefuncties opgeven voor indexering en zoeken via de veldeigenschappen indexAnalyzer en SearchAnalyzer. Indien niet opgegeven, wordt de analyseset met de analyse-eigenschap gebruikt voor zowel indexeren als zoeken. Als de analyse niet is opgegeven, wordt de standaard Lucene-standaardanalyse gebruikt.

Een algemene regel is om dezelfde analyse te gebruiken voor zowel indexering als query's, tenzij specifieke vereisten anders dicteren. Zorg ervoor dat u grondig test. Wanneer tekstverwerking verschilt op zoek- en indexeringstijd, loopt u het risico dat querytermen en geïndexeerde termen niet overeenkomen wanneer de zoek- en indexeeranalyseconfiguraties niet zijn uitgelijnd.

Testen tijdens actieve ontwikkeling

Voor het overschrijven van de standaardanalyse moet een index opnieuw worden opgebouwd. Bepaal indien mogelijk welke analyses moeten worden gebruikt tijdens de actieve ontwikkeling, voordat u een index in productie rolt.

Tokenized termen controleren

Als een zoekopdracht geen verwachte resultaten retourneert, is het meest waarschijnlijke scenario tokenverschillen tussen termeninvoer in de query en tokenized termen in de index. Als de tokens niet hetzelfde zijn, kunnen overeenkomsten niet worden gerealiseerd. Als u de uitvoer van de tokenizer wilt inspecteren, raden we u aan de Analyse-API te gebruiken als een onderzoekshulpprogramma. Het antwoord bestaat uit tokens, zoals gegenereerd door een specifieke analyse.

REST-voorbeelden

In de onderstaande voorbeelden ziet u analysedefinities voor enkele belangrijke scenario's.

Voorbeeld van aangepaste analyse

In dit voorbeeld ziet u een analysedefinitie met aangepaste opties. Aangepaste opties voor tekenfilters, tokenizers en tokenfilters worden afzonderlijk opgegeven als benoemde constructies en vervolgens verwezen in de analysedefinitie. Vooraf gedefinieerde elementen worden als zodanig gebruikt en waarnaar wordt verwezen op naam.

Door dit voorbeeld lopen:

  • Analyzers zijn een eigenschap van de veldklasse voor een doorzoekbaar veld.

  • Een aangepaste analyse maakt deel uit van een indexdefinitie. Het kan licht worden aangepast (bijvoorbeeld het aanpassen van één optie in één filter) of aangepast op meerdere plaatsen.

  • In dit geval is de custom analyzer 'my_analyzer', die op zijn beurt gebruikmaakt van een aangepaste standaardtokenizer 'my_standard_tokenizer' en twee tokenfilters: kleine letters en aangepast asciifoldingfilter 'my_asciifolding'.

  • Het definieert ook 2 aangepaste tekenfilters 'map_dash' en 'remove_whitespace'. De eerste vervangt alle streepjes door onderstrepingstekens terwijl de tweede alle spaties verwijdert. Spaties moeten UTF-8 zijn gecodeerd in de toewijzingsregels. De tekenfilters worden toegepast vóór tokenisatie en hebben invloed op de resulterende tokens (de standaardtokenizer-einden op streepjes en spaties, maar niet op onderstrepingsteken).

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

Voorbeeld van toewijzing per veldanalyse

De Standard Analyzer is de standaardwaarde. Stel dat u de standaardwaarde wilt vervangen door een andere vooraf gedefinieerde analyse, zoals de patroonanalyse. Als u geen aangepaste opties instelt, hoeft u deze alleen op naam in de velddefinitie op te geven.

Het element Analyse overschrijft de Standard-analyse op veldbasis. Er is geen wereldwijde onderdrukking. In dit voorbeeld text1 wordt de patroonanalyse gebruikt en text2, die geen analyse opgeeft, de standaardwaarde gebruikt.

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

Analysefuncties combineren voor indexerings- en zoekbewerkingen

De API's bevatten indexkenmerken voor het opgeven van verschillende analysefuncties voor indexering en zoekopdrachten. De kenmerken searchAnalyzer en indexAnalyzer moeten worden opgegeven als een paar, waarbij het kenmerk single analyzer wordt vervangen.

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

Voorbeeld van Taalanalyse

Velden met tekenreeksen in verschillende talen kunnen gebruikmaken van een taalanalyse, terwijl andere velden de standaardwaarde behouden (of een andere vooraf gedefinieerde of aangepaste analyse gebruiken). Als u een taalanalyse gebruikt, moet deze worden gebruikt voor indexerings- en zoekbewerkingen. Velden die gebruikmaken van een taalanalyse kunnen geen verschillende analysefuncties hebben voor indexering en zoekopdrachten.

  {
     "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#-voorbeelden

Als u de .NET SDK-codevoorbeelden gebruikt, kunt u deze voorbeelden toevoegen om analyses te gebruiken of te configureren.

Een taalanalyse toewijzen

Elke analyse die als zodanig wordt gebruikt, zonder configuratie, wordt opgegeven in een velddefinitie. Er is geen vereiste voor het maken van een vermelding in de sectie [analyzers] van de index.

Taalanalyses worden als zodanig gebruikt. Als u deze wilt gebruiken, roept u LexicalAnalyzer aan en geeft u het type LexicalAnalyzerName op dat een tekstanalyse biedt die wordt ondersteund in Azure AI Search.

Aangepaste analysefuncties worden op dezelfde manier opgegeven in de velddefinitie, maar om dit te laten werken, moet u de analyse in de indexdefinitie opgeven, zoals beschreven in de volgende sectie.

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

Een aangepaste analyse definiëren

Wanneer aanpassing of configuratie is vereist, voegt u een analyseconstructie toe aan een index. Zodra u deze hebt gedefinieerd, kunt u deze toevoegen aan de velddefinitie, zoals in het vorige voorbeeld is gedemonstreerd.

Maak een CustomAnalyzer-object . Een aangepaste analyse is een door de gebruiker gedefinieerde combinatie van een bekende tokenizer, nul of meer tokenfilters en nul of meer tekenfilternamen:

In het volgende voorbeeld wordt een aangepaste analyse met de naam 'url-analyze' gemaakt die gebruikmaakt van de uax_url_email tokenizer en het filter Voor kleine letters.

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

Volgende stappen

Een gedetailleerde beschrijving van de uitvoering van query's vindt u in zoeken in volledige tekst in Azure AI Search. In het artikel worden voorbeelden gebruikt om gedrag uit te leggen dat mogelijk contra-intuïtief lijkt op het oppervlak.

Zie de volgende artikelen voor meer informatie over analyse: