Analysetools für Textverarbeitung in Azure AI Search

Ein Analysetool ist eine Komponente der Volltextsuch-Engine, das für die Verarbeitung von Zeichenfolgen während der Indizierung und Abfrageausführung verantwortlich ist. Die Textverarbeitung (auch als lexikalische Analyse bezeichnet) ist transformativ und ändert eine Zeichenfolge durch folgende Aktionen:

  • Entfernen nicht unbedingt benötigter Wörter (Stoppwörter) und Satzzeichen
  • Unterteilen von Ausdrücken und Wörtern mit Bindestrichen in Einzelwörter
  • Umwandeln von Wörtern in Großbuchstaben in Wörter in Kleinbuchstaben
  • Kürzen von Wörtern in primitive Stammformen für die Speichereffizienz, damit Übereinstimmungen unabhängig von der Zeitform gefunden werden

Die Analyse gilt für Edm.String-Felder, die als „durchsuchbar“ gekennzeichnet sind, was auf die Volltextsuche hinweist.

Bei Feldern dieser Konfiguration erfolgt die Analyse während der Indizierung, wenn Token erstellt werden und dann noch mal während der Abfrageausführung, wenn Abfragen analysiert werden und die Engine diese auf übereinstimmende Token überprüft. Eine Übereinstimmung ist wahrscheinlicher, wenn dasselbe Analysetool sowohl für die Indizierung als auch für Abfragen verwendet wird. Sie können das Tool jedoch für jede Workload in Abhängigkeit von Ihren Anforderungen einzeln festlegen.

Abfragetypen, bei denen es sich nicht um eine Volltextsuche handelt (z. B. Filter oder Fuzzysuche), durchlaufen auf der Abfrageseite nicht die Analysephase. Stattdessen sendet der Parser diese Zeichenfolgen direkt an die Suchmaschine, wobei das Muster verwendet wird, das Sie als Grundlage für die Suche bereitstellen. In der Regel erfordern diese Abfrageformulare ganze Zeichenfolgentoken für den Musterabgleich. Um sicherzustellen, dass ganze Ausdruckstoken während der Indizierung erhalten werden, benötigen Sie möglicherweise benutzerdefinierte Analysegeräte. Weitere Informationen darüber, wann und warum Abfragebegriffe analysiert werden, finden Sie unter Funktionsweise der Volltextsuche in der Azure AI Search.

Weitere Hintergrundinformationen zur lexikalischen Analyse finden Sie im folgenden Videoclip.

Standardanalysemodul

In Azure AI Search wird ein Analysetool automatisch für alle Zeichenfolgenfelder aufgerufen, die als durchsuchbar markiert sind.

Azure AI Search verwendet standardmäßig das Standardanalysetool von Apache Lucene (Standard-Lucene). Dieses unterteilt Text gemäß den Regeln der Unicode-Textsegmentierung in einzelne Elemente. Das Standardanalysetool konvertiert alle Zeichen in Kleinbuchstaben. Während der Indizierung und der Abfrageverarbeitung durchlaufen sowohl indizierte Dokumente als auch Suchbegriffe die Analyse.

Dieser Standard kann feldspezifisch überschrieben werden. Alternative Analysetools können ein Sprachanalysetool für die linguistische Verarbeitung, ein benutzerdefiniertes Analysetool oder ein integriertes Analysetool aus der Liste der verfügbaren Analysetools sein.

Typen von Analysetools

Die folgende Liste gibt Aufschluss darüber, welche Analysetools in Azure AI Search unterstützt werden.

Category Beschreibung
Lucene-Standardanalyse Standard. Muss nicht angegeben oder konfiguriert werden. Dieses allgemeine Analysetool eignet sich für viele Sprachen und Szenarios.
Integrierte Analysetools Wird unverändert verwendet und wird anhand des Namens referenziert. Es gibt zwei Typen: Sprache und sprachunabhängig.

Spezialisierte (sprachunabhängige) Analysetools werden verwendet, wenn Texteingaben eine spezielle oder minimale Verarbeitung erfordern. Beispiele für die Analysetools in dieser Kategorie sind Asciifolding, Keyword, Pattern, Simple, Stop und Whitespace.

Sprachanalysetools werden verwendet, wenn umfassende linguistische Unterstützung für einzelne Sprachen benötigt werden. Azure AI Search unterstützt 35 Lucene-Sprachanalysen und 50 Microsoft-Analysen für die Verarbeitung natürlicher Sprache.
Benutzerdefinierte Analysen Eine benutzerdefinierte Konfiguration einer Kombination vorhandener Elemente, bestehend aus einem Tokenizer (erforderlich) und optionalen Filtern („char“ oder „token“).

Ein paar integrierte Analysetools wie Pattern oder Stop unterstützen eine begrenzte Anzahl von Konfigurationsoptionen. Erstellen Sie zum Festlegen dieser Optionen ein benutzerdefiniertes Analysetool, bestehend aus dem integrierten Analysetool und einer der unter Integrierte Analysetools dokumentierten alternativen Optionen. Versehen Sie Ihre neue Konfiguration wie üblich mit einem Namen (etwa myPatternAnalyzer), damit sie von der Lucene-Musteranalyse zu unterscheiden ist.

Angeben von Analysetools

Das Festlegen eines Analysetools ist optional. Es wird generell empfohlen, zunächst das Lucene-Standardanalysetool zu verwenden, um herauszufinden, wie es funktioniert. Wenn Abfragen nicht die erwarteten Ergebnisse zurückgeben, ist der Wechsel zu einem anderen Analysetool häufig die richtige Lösung.

  1. Wenn Sie ein benutzerdefiniertes Analysetool verwenden, fügen Sie es dem Suchindex im Abschnitt „Analysetool“ hinzu. Weitere Informationen finden Sie unter Create Index (Index erstellen) sowie unter Add a custom analyzer (Benutzerdefiniertes Analysetool hinzufügen).

  2. Wenn Sie ein Feld definieren, legen Sie dessen Eigenschaft „analyzer“ auf einen der folgenden Werte fest: ein integriertes Analysetool wie Keyword, ein Sprachanalysetool wie en.microsoft oder ein benutzerdefiniertes Analysetool (definiert in demselben Indexschema).

      "fields": [
     {
       "name": "Description",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "analyzer": "en.microsoft",
       "indexAnalyzer": null,
       "searchAnalyzer": null
     },
    
  3. Wenn Sie ein Sprachanalysetool verwenden, müssen Sie es mit der Eigenschaft „analyzer“ angeben. Die Eigenschaften „searchAnalyzer“ und „indexAnalyzer“ können bei Sprachanalysetools nicht angewendet werden.

  4. Alternativ können Sie „indexAnalyzer“ und „searchAnalyzer“ festlegen, um für jede Workload unterschiedliche Analysetools zu verwenden. Diese Eigenschaften funktionieren zusammen als Ersatz für die Eigenschaft „analyzer“, die „null“ sein muss. Sie können verschiedene Analysetools für die Indizierung und Abfragen verwenden, wenn eine dieser Aktivitäten eine bestimmte Transformation erfordert, die die andere nicht benötigt.

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

Gründe zum Hinzufügen von Analysetools

Der beste Zeitpunkt zum Hinzufügen und Zuweisen von Analysetools ist während der aktiven Entwicklung, wenn das Löschen und Neuerstellen von Indizes Routine ist.

Da Analysetools für das Umwandeln von Ausdrücken in Token verwendet werden, sollten Sie ein Analysetool zuweisen, wenn das Feld erstellt wird. Tatsächlich ist es nicht zulässig, ein Analysetool oder „indexAnalyzer“ einem Feld zuzuweisen, das bereits physisch erstellt wurde (obwohl Sie die Eigenschaft „searchAnalyzer“ jederzeit ohne Auswirkung auf den Index ändern können).

Wenn Sie das Analysetool eines vorhandenen Felds ändern möchten, müssen Sie den gesamten Index löschen und neu erstellen (einzelne Felder können Sie nicht neu erstellen). Für Indizes in der Produktion können Sie ein erneutes Erstellen aufschieben, indem Sie ein neues Feld mit der neuen Analysetoolzuweisung erstellen und diese anstelle der alten verwenden. Integrieren Sie das neue Feld mit Update Index (Index aktualisieren), und füllen Sie es mit mergeOrUpload. Später können Sie den Index als Bestandteil der geplanten Indexwartung bereinigen, um veraltete Felder zu entfernen.

Rufen Sie Update Index (Index aktualisieren) auf, um ein neues Feld zu einem vorhandenen Index hinzuzufügen, und verwenden Sie mergeOrUpload, um es aufzufüllen.

Wenn Sie diesen Fehler vermeiden möchten, übergeben Sie das Flag „allowIndexDowntime“ in Index aktualisieren, um ein benutzerdefiniertes Analysetool zu einem vorhandenen Index hinzuzufügen.

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

Empfehlungen zum Arbeiten mit Analysetools

Dieser Abschnitt enthält Tipps zur Verwendung von Analyzern.

Eine einzelne Analyse für Lese-/Schreibvorgänge, sofern keine besonderen Anforderungen gelten

Azure AI Search ermöglicht das Angeben verschiedener Analysetools für das Indizieren und Suchen über die Feldeigenschaften „indexAnalyzer“ und „searchAnalyzer“. Wenn keine Angabe vorhanden ist, wird das mit der analyzer-Eigenschaft festgelegte Analysetool sowohl für die Indizierung als auch für die Suche verwendet. Ohne Angabe des Analysetools wird das Lucene-Standardanalysetool verwendet.

Allgemeine Regel: Verwenden Sie für die Indizierung und für Abfragen die gleiche Analyse, es sei denn, es müssen besondere Anforderungen erfüllt werden. Führen Sie die Tests sorgfältig durch. Wenn sich die Textverarbeitung zur Such- und Indizierungszeit unterscheidet, besteht das Risiko einer Nichtübereinstimmung zwischen Abfragebegriffen und indizierten Begriffen, wenn die Konfigurationen des Analysetools für Suche und Indizierung nicht abgestimmt sind.

Testen während der aktiven Entwicklung

Wenn Sie die Standardanalyse überschreiben, muss der Index neu erstellt werden. Überlegen Sie sich möglichst während der aktiven Entwicklung, welche Analysen Sie verwenden möchten, bevor Sie einen Index in die Produktionsumgebung einbringen.

Überprüfen von tokenisierten Begriffen

Wenn eine Suche nicht die erwarteten Ergebnisse zurückgibt, ist das wahrscheinlichste Szenario, dass Abweichungen zwischen Begriffseingaben für die Abfrage und tokenisierten Begriffen im Index vorliegen. Wenn die Token nicht identisch sind, können Übereinstimmungen nicht materialisiert werden. Zur Überprüfung der Tokenizer-Ausgabe wird empfohlen, die Analyse-API als Untersuchungstool zu verwenden. Die Antwort besteht aus Token, die von einem bestimmten Analyzer generiert wurden.

REST-Beispiele

Die folgenden Beispiele zeigen Analysedefinitionen für einige gängige Szenarien.

Beispiel eines benutzerdefinierten Analysetools

Dieses Beispiel zeigt eine Analysedefinition mit benutzerdefinierten Optionen. Benutzerdefinierte Optionen für char-Filter, Tokenizer und token-Filter werden separat als benannte Konstrukte angegeben, auf die dann in der Analysedefinition verwiesen wird. Vordefinierte Elemente werden unverändert verwendet und über ihren Namen angegeben.

Das Beispiel im Detail:

  • Analysen sind eine Eigenschaft der Feldklasse für ein durchsuchbares Feld.

  • Eine benutzerdefinierte Analyse ist Teil einer Indexdefinition. Sie kann geringfügig (etwa durch Anpassung einer einzelnen Option in einem einzelnen Filter) oder an mehreren Stellen angepasst werden.

  • In diesem Fall ist „my_analyzer“ die benutzerdefinierte Analyse, die wiederum den angepassten Standard-Tokenizer „my_standard_tokenizer“ und zwei token-Filter („lowercase“ und den angepassten asciifolding-Filter „my_asciifolding“) verwendet.

  • Zudem werden 2 benutzerdefinierte char-Filter definiert: „map_dash“ und „remove_whitespace“. Der erste ersetzt alle Striche durch Unterstriche, der zweite entfernt alle Leerzeichen. Leerzeichen müssen in den Zuordnungsregeln UTF-8-kodiert sein. Die char-Filter werden vor der Tokenisierung angewendet und wirken sich auf die resultierenden Token aus (der Standardtokenisierer trennt bei Gedankenstrichen und Leerzeichen, nicht aber bei Unterstrichen).

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

Beispiel für die Zuweisung eines Analysetools je Feld

Die Standardanalyse ist die Standardeinstellung. Angenommen, Sie möchten die Standardeinstellung durch eine andere vordefinierte Analyse (beispielsweise „pattern“) ersetzen. Wenn Sie keine benutzerdefinierten Optionen festlegen, müssen Sie nur dessen Namen in der Felddefinition angeben.

Das Element „analyzer“ überschreibt die Standardanalyse für das jeweilige Feld. Es findet keine globale Überschreibung statt. In diesem Beispiel verwendet text1 die Analyse „pattern“ und text2 die Standardanalyse, da hierfür keine Analyse angegeben ist.

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

Mischen von Analysetools für Indizierung und Suchvorgänge

Die APIs enthalten Indexattribute, die es ermöglichen, unterschiedliche Analysetools für Indizierung und Suchvorgänge anzugeben. searchAnalyzer- und indexAnalyzer-Attribut müssen als Paar angegeben werden und ersetzen das Einzelattribut analyzer.

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

Beispiel für ein Sprachanalysetool

Für Felder mit Zeichenfolgen in unterschiedlichen Sprachen kann eine Sprachanalyse verwendet werden, während für andere Felder weiterhin die Standardanalyse (oder eine andere vordefinierte oder benutzerdefinierte Analyse) verwendet wird. Bei Verwendung einer Sprachanalyse muss sie sowohl für die Indizierung als auch für Suchvorgänge verwendet werden. Bei Feldern, die ein Sprachanalysetool verwenden, kann es für Indizierung und Suche keine unterschiedlichen Analysetools geben.

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

Wenn Sie die.NET SDK-Codebeispiele verwenden, können Sie diese Beispiele anhängen, um Analysetools zu verwenden oder zu konfigurieren.

Zuweisen eines Sprachanalysetools

Jedes in unveränderter Form ohne Konfiguration verwendete Analysetool wird in einer Felddefinition angegeben. Es ist nicht erforderlich, einen Eintrag im Abschnitt Analysetools des Indexes zu erstellen.

Sprachanalysen werden in der vorliegenden Form verwendet. Um sie zu verwenden, rufen Sie LexicalAnalyzer unter Angabe des Typs LexicalAnalyzerName auf, mit dem ein in Azure AI Search unterstütztes Textanalysetool bereitgestellt wird.

Benutzerdefinierte Analysetools werden in der Felddefinition auf ähnliche Weise angegeben. Hierzu müssen Sie das Analysetool in der Indexdefinition angeben. Eine entsprechende Anleitung finden Sie im nächsten Abschnitt.

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

Definieren eines benutzerdefinierten Analysetools

Wenn eine Anpassung oder Konfiguration erforderlich ist, fügen Sie einem Index ein Analysetoolkonstrukt hinzu. Nach der Definition können Sie es der Felddefinition hinzufügen, wie im vorherigen Beispiel gezeigt.

Erstellen Sie ein CustomAnalyzer-Objekt. Ein benutzerdefiniertes Analysetool ist eine benutzerdefinierte Kombination aus einem bekannten Tokenizer, keinem oder mehreren Tokenfiltern und keinem oder mehreren Zeichenfilternamen:

Im folgenden Beispiel wird ein benutzerdefiniertes Analysetool mit dem Namen „url-analyze“ erstellt, für das der Tokenizer „uax_url_email“ und der Kleinbuchstaben-Tokenfilter verwendet werden.

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

Nächste Schritte

Eine ausführliche Beschreibung der Abfrageausführung finden Sie in der Volltextsuche in Azure AI Search. In diesem Artikel werden anhand von Beispielen Verhaltensweisen erklärt, die auf den ersten Blick vielleicht nicht intuitiv erscheinen.

Weitere Informationen zu Analysetools erhalten Sie in den folgenden Artikeln: