Analysverktyg för textbearbetning i Azure Cognitive Search

En analysverktyg är en komponent i sökmotorn för fulltext som ansvarar för bearbetning av strängar under indexering och frågekörning. Textbearbetning (kallas även lexikal analys) är transformerande och ändrar en sträng genom åtgärder som dessa:

  • Ta bort icke-viktiga ord (stoppord) och skiljetecken
  • Dela upp fraser och avstavade ord i komponentdelar
  • Gemener och versaler
  • Minska ord till primitiva rotformer för lagringseffektivitet och så att matchningar kan hittas oavsett tempus

Analysen gäller för Edm.String fält som är markerade som "sökbara", vilket indikerar fulltextsökning.

För fält i den här konfigurationen sker analys under indexering när token skapas och sedan igen under frågekörningen när frågor parsas och motorn söker efter matchande token. Det är troligare att en matchning inträffar när samma analysator används för både indexering och frågor, men du kan ange analysverktyg för varje arbetsbelastning oberoende av varandra, beroende på dina krav.

Frågetyper som inte är fulltextsökning, till exempel filter eller fuzzy-sökning, går inte igenom analysfasen på frågesidan. I stället skickar parsern dessa strängar direkt till sökmotorn med det mönster som du anger som grund för matchningen. Normalt kräver dessa frågeformulär heltalstoken för att mönstermatchning ska fungera. För att säkerställa token för hela termer under indexering kan du behöva anpassade analysverktyg. Mer information om när och varför frågetermer analyseras finns i Fulltextsökning i Azure Cognitive Search.

Om du vill ha mer bakgrundsinformation om lexikal analys kan du lyssna på följande videoklipp för en kort förklaring.

Standardanalysverktyg

I Azure Cognitive Search anropas en analysator automatiskt för alla strängfält som markerats som sökbara.

Som standard använder Azure Cognitive Search Apache Lucene Standard Analyzer (standard lucene) som delar upp text i element som följer reglerna för "Unicode-textsegmentering". Standardanalysatorn konverterar alla tecken till deras gemener. Både indexerade dokument och söktermer går igenom analysen under indexering och frågebearbetning.

Du kan åsidosätta standardinställningen fält för fält. Alternativa analysverktyg kan vara ett språkanalysverktyg för språklig bearbetning, ett anpassat analysverktyg eller ett inbyggt analysverktyg från listan över tillgängliga analysverktyg.

Typer av analysverktyg

I följande lista beskrivs vilka analysverktyg som är tillgängliga i Azure Cognitive Search.

Kategori Beskrivning
Standard Lucene Analyzer Standard. Ingen specifikation eller konfiguration krävs. Den här analysatorn för generell användning fungerar bra för många språk och scenarier.
Inbyggda analysverktyg Förbrukas som den är och refereras till med namn. Det finns två typer: språk och språkagnostisk.

Specialiserade (språkagnostiska) analysverktyg används när textindata kräver specialiserad bearbetning eller minimal bearbetning. Exempel på analysverktyg i den här kategorin är Asciifolding, Keyword, Pattern, Simple, Stop, Whitespace.

Språkanalysverktyg används när du behöver omfattande språkstöd för enskilda språk. Azure Cognitive Search stöder 35 språkanalysverktyg för Lucene och 50 Microsoft analysverktyg för bearbetning av naturligt språk.
Anpassade analysverktyg Refererar till en användardefinierad konfiguration av en kombination av befintliga element, som består av en tokenizer (krävs) och valfria filter (tecken eller token).

Några inbyggda analysverktyg, till exempel Pattern eller Stop, har stöd för en begränsad uppsättning konfigurationsalternativ. Om du vill ange de här alternativen skapar du ett anpassat analysverktyg som består av det inbyggda analysverktyg och ett av de alternativ som beskrivs i Inbyggda analysverktyg. Precis som med alla anpassade konfigurationer ger du den nya konfigurationen ett namn, till exempel myPatternAnalyzer för att skilja den från Lucene Pattern-analysatorn.

Ange analysverktyg

Det är valfritt att ange ett analysverktyg. Som en allmän regel kan du prova att först använda standardstandarden Lucene Analyzer för att se hur den fungerar. Om frågor inte returnerar det förväntade resultatet är det ofta rätt lösning att växla till ett annat analysverktyg.

  1. Om du använder ett anpassat analysverktyg lägger du till det i sökindexet under avsnittet "analyzer". Mer information finns i Skapa index och även Lägg till anpassade analysverktyg.

  2. När du definierar ett fält anger du egenskapen "analyzer" till något av följande: ett inbyggt analysverktyg , till exempel nyckelord, ett språkanalysverktyg som en.microsoft, eller ett anpassat analysverktyg (definierat i samma indexschema).

      "fields": [
     {
       "name": "Description",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "analyzer": "en.microsoft",
       "indexAnalyzer": null,
       "searchAnalyzer": null
     },
    
  3. Om du använder ett språkanalysverktyg måste du använda egenskapen "analyzer" för att ange den. Egenskaperna "searchAnalyzer" och "indexAnalyzer" gäller inte för språkanalysverktyg.

  4. Alternativt kan du ange "indexAnalyzer" och "searchAnalyzer" för att variera analysatorn för varje arbetsbelastning. Dessa egenskaper fungerar tillsammans som en ersättning för egenskapen "analyzer", som måste vara null. Du kan använda olika analysverktyg för indexering och frågor om en av dessa aktiviteter kräver en specifik transformering som inte behövs av den andra.

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

När analysverktyg ska läggas till

Den bästa tiden att lägga till och tilldela analysverktyg är under aktiv utveckling, när du släpper och återskapar index är rutin.

Eftersom analysverktyg används för att tokenisera termer bör du tilldela ett analysverktyg när fältet skapas. I själva verket är det inte tillåtet att tilldela en analysator eller indexAnalyzer till ett fält som redan har skapats fysiskt (även om du kan ändra egenskapen searchAnalyzer när som helst utan att indexet påverkas).

Om du vill ändra analysatorn för ett befintligt fält måste du släppa och återskapa hela indexet (du kan inte återskapa enskilda fält). För index i produktion kan du skjuta upp en återskapande genom att skapa ett nytt fält med den nya analystilldelningen och börja använda den i stället för den gamla. Använd Uppdateringsindex för att införliva det nya fältet och mergeOrUpload för att fylla i det. Senare, som en del av den planerade indexservicen, kan du rensa indexet för att ta bort föråldrade fält.

Om du vill lägga till ett nytt fält i ett befintligt index anropar du Uppdatera index för att lägga till fältet och mergeOrUpload för att fylla i det.

Om du vill lägga till ett anpassat analysverktyg i ett befintligt index skickar du flaggan "allowIndexDowntime" i Uppdateringsindex om du vill undvika det här felet:

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

Rekommendationer för att arbeta med analysverktyg

Det här avsnittet innehåller råd om hur du arbetar med analysverktyg.

En analysator för läsning och skrivning om du inte har specifika krav

Azure Cognitive Search kan du ange olika analysverktyg för indexering och söka igenom fältegenskaperna "indexAnalyzer" och "searchAnalyzer". Om den är ospecificerad används analysverktygsuppsättningen med egenskapen analyzer för både indexering och sökning. Om analysatorn är ospecificerad används Standard Lucene-analysatorn.

En allmän regel är att använda samma analysverktyg för både indexering och frågor, såvida inte särskilda krav kräver något annat. Se till att testa noggrant. När textbearbetningen skiljer sig åt vid söknings- och indexeringstiden riskerar du att matcha frågetermer och indexerade termer när konfigurationerna för analysverktygen för sökning och indexering inte justeras.

Testa under aktiv utveckling

Om du ska åsidosätta standardanalysen måste du återskapa indexet. Välj om möjligt vilka analysverktyg som ska användas under aktiv utveckling innan du distribuerar ett index till produktion.

Granska tokeniserade termer

Om en sökning inte returnerar förväntade resultat är det mest sannolika scenariot tokenavvikelser mellan termindata i frågan och tokeniserade termer i indexet. Om token inte är desamma kan matchningar inte materialiseras. Om du vill granska tokenizer-utdata rekommenderar vi att du använder Analysera API som ett undersökningsverktyg. Svaret består av token, som genereras av en specifik analysator.

REST-exempel

Exemplen nedan visar analysdefinitioner för några viktiga scenarier.

Exempel på anpassad analys

Det här exemplet illustrerar en analysdefinition med anpassade alternativ. Anpassade alternativ för teckenfilter, tokenizers och tokenfilter anges separat som namngivna konstruktioner och refereras sedan till i analysdefinitionen. Fördefinierade element används som de är och refereras till med namn.

Gå igenom det här exemplet:

  • Analysverktyg är en egenskap för fältklassen för ett sökbart fält.

  • En anpassad analysator är en del av en indexdefinition. Det kan vara lätt anpassat (till exempel att anpassa ett enda alternativ i ett filter) eller anpassas på flera platser.

  • I det här fallet är den anpassade analysatorn "my_analyzer", som i sin tur använder en anpassad standardtokeniserare "my_standard_tokenizer" och två tokenfilter: gemener och anpassat asciifoldingfilter "my_asciifolding".

  • Den definierar också två anpassade teckenfilter "map_dash" och "remove_whitespace". Den första ersätter alla bindestreck med understreck medan den andra tar bort alla blanksteg. Blanksteg måste vara UTF-8-kodade i mappningsreglerna. Char-filtren tillämpas före tokenisering och påverkar de resulterande token (standardtokeniseraren bryts på bindestreck och blanksteg men inte på understreck).

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

Exempel på tilldelning per fältanalys

Standardanalys är standardvärdet. Anta att du vill ersätta standardvärdet med ett annat fördefinierat analysverktyg, till exempel mönsteranalyseraren. Om du inte anger anpassade alternativ behöver du bara ange det med namnet i fältdefinitionen.

Elementet "analyzer" åsidosätter standardanalyseraren fält för fält. Det finns ingen global åsidosättning. I det här exemplet text1 använder mönsteranalyseraren och text2, som inte anger ett analysverktyg, standardvärdet.

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

Blanda analysverktyg för indexering och sökåtgärder

API:erna innehåller indexattribut för att ange olika analysverktyg för indexering och sökning. Attributen searchAnalyzer och indexAnalyzer måste anges som ett par och ersätta attributet single analyzer.

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

Exempel på språkanalys

Fält som innehåller strängar på olika språk kan använda ett språkanalysverktyg, medan andra fält behåller standardvärdet (eller använder någon annan fördefinierad eller anpassad analysator). Om du använder ett språkanalysverktyg måste det användas för både indexerings- och sökåtgärder. Fält som använder ett språkanalysverktyg kan inte ha olika analysverktyg för indexering och sökning.

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

Om du använder .NET SDK-kodexemplen kan du lägga till dessa exempel för att använda eller konfigurera analysverktyg.

Tilldela ett språkanalysverktyg

Alla analysverktyg som används som de är, utan konfiguration, anges i en fältdefinition. Det finns inget krav på att skapa en post i avsnittet [analysverktyg] i indexet.

Språkanalysverktyg används som de är. Om du vill använda dem anropar du LexicalAnalyzer och anger typen LexicalAnalyzerName och tillhandahåller en textanalys som stöds i Azure Cognitive Search.

Anpassade analysverktyg anges på liknande sätt i fältdefinitionen, men för att det ska fungera måste du ange analysatorn i indexdefinitionen enligt beskrivningen i nästa avsnitt.

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

Definiera ett anpassat analysverktyg

När anpassning eller konfiguration krävs lägger du till en analyskonstruktion i ett index. När du har definierat den kan du lägga till fältdefinitionen som visas i föregående exempel.

Skapa ett CustomAnalyzer-objekt . En anpassad analysator är en användardefinierad kombination av en känd tokenizer, noll eller flera tokenfilter och noll eller fler teckenfilternamn:

I följande exempel skapas ett anpassat analysverktyg med namnet "url-analyze" som använder uax_url_email tokenizer och tokenfiltret Gemener.

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

Fler exempel finns i CustomAnalyzerTests.cs.

Nästa steg

En detaljerad beskrivning av frågekörning finns i Fulltextsökning i Azure Cognitive Search. Artikeln använder exempel för att förklara beteenden som kan verka kontraintuitiva på ytan.

Mer information om analysverktyg finns i följande artiklar: