Suche nach Teilausdrücken und Mustern mit Sonderzeichen (Bindestriche, Platzhalter, reguläre Ausdrücke, Muster)

Eine Suche nach Teilausdrücken ist eine Abfrage, die aus einem Begriffsfragment besteht, d. h. anstelle eines ganzen Begriffs nur den Beginn, das Mittelteil oder Ende des Begriffs enthält (manchmal auch als Präfix-, Infix- oder Suffixabfrage bezeichnet). Eine Suche nach Teilausdrücken kann eine Kombination von Fragmenten sein, wobei oft Sonderzeichen wie Bindestriche, Gedankenstriche oder Schrägstriche Teil der Abfragezeichenfolge sind. Häufige Anwendungsfälle sind Teile von Telefonnummern, URLs, Codes oder mit Bindestrichen zusammengesetzten Wörtern.

Teilbegriffe und Sonderzeichen können problematisch sein, wenn der Index kein Token aufweist, welches das Textfragment darstellt, nach dem Sie suchen möchten. Während der Phase der lexikalischen Analyse der Schlüsselwortindizierung werden (bei Verwendung des Standardanalysetools) Sonderzeichen verworfen, zusammengesetzte Wörter aufgeteilt und Leerzeichen gelöscht. Wenn Sie nach einem Textfragment suchen, das während der lexikalischen Analyse geändert wurde, schlägt die Abfrage fehl, da keine Übereinstimmung gefunden wird. Sehen Sie sich dieses Beispiel an: Die Telefonnummer +1 (425) 703-6214 (tokenisiert als "1", "425", "703", "6214") wird in der Abfrage "3-62" nicht angezeigt, da dieser Inhalt nicht im Index vorhanden ist.

Die Lösung besteht darin, während der Indizierung ein Analysetool aufzurufen, das eine vollständige Zeichenfolge beibehält, ggf. einschließlich Leerzeichen und Sonderzeichen, damit Sie die Leer- und Sonderzeichen in Ihre Abfragezeichenfolge einbeziehen können. Eine vollständige Zeichenfolge, die nicht in kleinere Teile tokenisiert wurde, ermöglicht den Musterabgleich für „Beginnt mit“- oder „Endet mit“-Abfragen, wobei das von Ihnen bereitgestellte Muster anhand eines Begriffs ausgewertet werden kann, der nicht durch lexikalische Analysen transformiert wird.

Wenn Sie Suchszenarien unterstützen müssen, die für analysierte und nicht analysierte Inhalte aufrufen, sollten Sie für jedes Szenario zwei Felder in Ihrem Index erstellen. Ein Feld durchläuft eine lexikalische Analyse. Im zweiten Feld wird eine intakte Zeichenfolge gespeichert. Dabei wird ein Analysetools verwendet, das den Inhalt beibehält und ganze Zeichenfolgentoken für den Musterabgleich ausgibt.

Die Azure KI-Suche sucht im Index nach vollständigen tokenisierten Begriffen und findet keine Entsprechung für einen Teilausdruck, sofern Sie keine Platzhalteroperatoren (* und ?) einbeziehen oder die Abfrage als regulären Ausdruck formatieren.

Teilausdrücke werden mithilfe der folgenden Methoden angegeben:

  • Abfragen mit regulären Ausdrücken können beliebige reguläre Ausdrücke sein, die unter Apache Lucene gültig sind.

  • Platzhalteroperatoren mit Präfixübereinstimmung beziehen sich auf ein allgemein bekanntes Muster, das den Anfang eines Begriffs gefolgt von den Suffixoperatoren * oder ? enthält, wie z. B. die search=cap*-Übereinstimmung für „Cap'n Jack's Waterfront Inn“ oder „Highline Capital“. Die Präfixübereinstimmung wird sowohl in der einfachen als auch vollständigen Lucene-Abfragesyntax unterstützt.

  • Platzhalter mit Infix- und Suffixübereinstimmung platzieren die Operatoren * und ? innerhalb oder am Anfang eines Ausdrucks und erfordern eine Syntax regulärer Ausdrücke (wobei der Ausdruck in Schrägstriche eingeschlossen ist). Beispielsweise gibt die Abfragezeichenfolge (search=/.*numeric.*/) Ergebnisse zu Suffix- und Infixübereinstimmungen mit „alphanumeric“ und „alphanumerical“ zurück.

Für die Suche nach regulären Ausdrücken, Platzhaltern und Fuzzy-Matches werden zur Abfragezeit keine Analysetools verwendet. Für diese Abfrageformen, die der Parser dadurch erkennt, dass Operatoren und Trennzeichen vorhanden sind, wird die Abfragezeichenfolge ohne eine lexikalische Analyse an die Engine übergeben. Für diese Abfrageformen wird das im Feld angegebene Analysetool ignoriert.

Hinweis

Bei einer partiellen Abfragezeichenfolge, die Zeichen wie z. B. Schrägstriche in einem URL-Fragment enthält, müssen Sie möglicherweise Escapezeichen hinzufügen. In JSON ist das Escapezeichen für einen Schrägstrich (/) ein umgekehrter Schrägstrich (\). Somit ist search=/.*microsoft.com\/azure\/.*/ die Syntax für das URL-Fragment „microsoft.com/azure/“.

Lösen von Problemen bei der Suche nach Teilausdrücken/Mustern

Wenn Sie nach Fragmenten, Mustern oder Sonderzeichen suchen müssen, können Sie das Standardanalysetool mit einem benutzerdefinierten Analysetool überschreiben, das einfachere Tokenisierungsregeln befolgt und die gesamte Zeichenfolge im Index beibehält.

Der Ansatz sieht wie folgt aus:

  1. Definieren Sie ein zweites Feld zum Speichern einer intakten Version der Zeichenfolge (unter der Voraussetzung, dass Sie analysierten und nicht analysierten Text zum Abfragezeitpunkt benötigen).
  2. Evaluieren Sie verschiedene Analysetools, die Token mit dem richtigen Grad an Granularität ausgeben, und wählen Sie eines aus.
  3. Zuweisen des Analysetools zum Feld
  4. Erstellen und Testen des Index

1 – Erstellen eines dedizierten Felds

Analysetools bestimmen, wie Begriffe in einem Index tokenisiert werden. Da Analysetools pro Feld zugewiesen werden, können Sie Felder in Ihrem Index erstellen, die für verschiedene Szenarien optimiert werden können. Sie können beispielsweise „featureCode“ und „featureCodeRegex“ definieren, um für ein Szenario eine reguläre Volltextsuche und für ein anderes Szenario einen erweiterten Musterabgleich zu unterstützen. Die den einzelnen Feldern zugewiesenen Analysetools bestimmen, wie die Inhalte der einzelnen Felder im Index tokenisiert werden.

{
  "name": "featureCode",
  "type": "Edm.String",
  "retrievable": true,
  "searchable": true,
  "analyzer": null
},
{
  "name": "featureCodeRegex",
  "type": "Edm.String",
  "retrievable": true,
  "searchable": true,
  "analyzer": "my_custom_analyzer"
},

2 – Festlegen eines Analysetools

Für die Generierung von Token mit vollständigen Ausdrücken werden häufig die folgenden Analysetools ausgewählt:

Analyzer Verhalten
Sprachanalysen Behält Bindestriche in zusammengesetzten Wörtern oder Zeichenfolgen, Umlaute und Verbformen bei. Wenn Abfragemuster Bindestriche enthalten, kann die Verwendung einer Sprachanalyse ausreichen.
Schlüsselwort (keyword) Der Inhalt des gesamten Felds wird als ein Ausdruck tokenisiert.
whitespace Die Trennung erfolgt nur anhand von Leerzeichen. Ausdrücke, die Bindestriche oder andere Zeichen enthalten, werden als einzelnes Token behandelt.
Benutzerdefiniertes Analysetool (Empfohlen) Beim Erstellen eines benutzerdefinierten Analysetools können Sie sowohl den Tokenizer als auch den Tokenfilter angeben. Die obigen Analysetools müssen unverändert verwendet werden. Bei einem benutzerdefinierten Analysetool können Sie auswählen, welche Tokenizer und Tokenfilter genutzt werden sollen.

Eine empfohlene Kombination ist der Schlüsselwort-Tokenizer mit einem Kleinbuchstaben-Tokenfilter. Ohne Filter wandelt das integrierte Schlüsselwort-Analysetool Großbuchstaben nicht in Kleinbuchstaben um. Dies kann dazu führen, dass Abfragen nicht erfolgreich sind. Bei einem benutzerdefinierten Analysetool erhalten Sie einen Mechanismus zum Hinzufügen des Kleinbuchstaben-Tokenfilters.

Mithilfe eines REST-Clients können Sie den Test Analyzer REST-Aufruf hinzufügen, um die tokenisierte Ausgabe zu prüfen.

Der Index muss im Suchdienst vorhanden sein, kann jedoch leer sein. Bei Verwendung eines vorhandenen Index und eines Felds mit Bindestrichen oder Teilen von Ausdrücken können Sie für bestimmte Ausdrücke verschiedene Analysetools einsetzen, um zu ermitteln, welche Token ausgegeben werden.

  1. Verwenden Sie zunächst das Standardanalysetool, um herauszufinden, wie Ausdrücke standardmäßig tokenisiert werden.

    {
    "text": "SVP10-NOR-00",
    "analyzer": "standard"
    }
    
  2. Werten Sie die Antwort aus, um zu ermitteln, wie der Text im Index tokenisiert wird. Beachten Sie, wie jeder Begriff in Kleinschreibung umgewandelt, Bindestriche entfernt und Teilzeichenfolgen in einzelne Token aufgeschlüsselt werden. Nur die Abfragen, die mit diesen Token übereinstimmen, geben dieses Dokument in den Ergebnissen zurück. Eine Abfrage, die „10-NOR“ umfasst, erzeugt einen Fehler.

    {
        "tokens": [
            {
                "token": "svp10",
                "startOffset": 0,
                "endOffset": 5,
                "position": 0
            },
            {
                "token": "nor",
                "startOffset": 6,
                "endOffset": 9,
                "position": 1
            },
            {
                "token": "00",
                "startOffset": 10,
                "endOffset": 12,
                "position": 2
            }
        ]
    }
    
  3. Ändern Sie die Anforderung so, dass das Analysetool whitespace oder keyword verwendet wird:

    {
    "text": "SVP10-NOR-00",
    "analyzer": "keyword"
    }
    
  4. Dieses Mal enthält die Antwort ein einzelnes Token in Großbuchstaben, bei dem die Bindestriche der Zeichenfolge beibehalten wurden. Falls Sie nach einem Muster oder Teilausdruck wie „10-NOR“ suchen müssen, verfügt die Abfrage-Engine jetzt über die Grundlage für die Ermittlung einer Übereinstimmung.

    {
    
        "tokens": [
            {
                "token": "SVP10-NOR-00",
                "startOffset": 0,
                "endOffset": 12,
                "position": 0
            }
        ]
    }
    

Wichtig

Hierbei ist zu beachten, dass Abfrageparser beim Erstellen der Abfragestruktur die Ausdrücke eines Suchbegriffs häufig in Kleinbuchstaben umwandeln. Bei Verwendung eines Analysetools, bei dem Texteingaben während der Indizierung nicht in Kleinbuchstaben umgewandelt werden, kann dies der Grund dafür sein, warum Sie nicht die erwarteten Ergebnisse erhalten. Die Lösung besteht darin, einen Kleinbuchstaben-Tokenfilter hinzuzufügen, wie im Abschnitt „Verwenden von benutzerdefinierten Analysetools“ weiter unten beschrieben.

3 – Konfigurieren eines Analysetools

Unabhängig davon, ob Sie Analysetools auswerten oder eine bestimmte Konfiguration einsetzen, gilt Folgendes: Sie müssen das Analysetool in der Felddefinition angeben und ggf. das Analysetool selbst konfigurieren, falls Sie keine integrierte Version nutzen. Beim Austauschen von Analysetools müssen Sie in der Regel den Index neu erstellen (löschen, neu erstellen und neu laden).

Verwenden von integrierten Analysetools

Integrierte Analysetools können anhand des Namens in einer analyzer Eigenschaft einer Felddefinition angegeben werden, ohne dass im Index eine zusätzliche Konfiguration erforderlich ist. Im folgenden Beispiel wird veranschaulicht, wie Sie das Analysetool whitespace für ein Feld festlegen.

Weitere Szenarios und weitere Informationen zu anderen integrierten Analysemodulen finden Sie unter Integrierte Analysetoolreferenz.

    {
      "name": "phoneNumber",
      "type": "Edm.String",
      "key": false,
      "retrievable": true,
      "searchable": true,
      "analyzer": "whitespace"
    }

Verwenden von benutzerdefinierten Analysetools

Wenn Sie ein benutzerdefiniertes Analysetool verwenden, definieren Sie es im Index mit einer benutzerdefinierten Kombination aus Tokenizer und Tokenfilter mit den möglichen Konfigurationseinstellungen. Als Nächstes verweisen Sie in einer Felddefinition darauf, wie Sie dies auch für ein integriertes Analysetool tun.

Wenn das Ziel die Tokenisierung des gesamten Ausdrucks ist, empfehlen wir Ihnen die Verwendung eines benutzerdefinierten Analysetools mit einem Schlüsselwort-Tokenizer und einem Kleinbuchstaben-Tokenfilter.

  • Der Schlüsselwort-Tokenizer erstellt für den gesamten Inhalt eines Felds jeweils ein Token.
  • Mit dem Kleinbuchstaben-Tokenfilter werden Großbuchstaben in Kleinbuchstaben umgewandelt. Mit Abfrageparsern werden Texteingaben in Großbuchstaben normalerweise in Kleinbuchstaben umgewandelt. Bei der Umwandlung in Kleinbuchstaben werden die Eingaben mit den tokenisierten Ausdrücken homogenisiert.

Im folgenden Beispiel ist ein benutzerdefiniertes Analysetool dargestellt, das über einen Schlüsselwort-Tokenizer und einen Kleinbuchstaben-Tokenfilter verfügt.

{
"fields": [
  {
    "name": "accountNumber",
    "analyzer":"myCustomAnalyzer",
    "type": "Edm.String",
    "searchable": true,
    "filterable": true,
    "retrievable": true,
    "sortable": false,
    "facetable": false
  }
],

"analyzers": [
  {
    "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
    "name":"myCustomAnalyzer",
    "charFilters":[],
    "tokenizer":"keyword_v2",
    "tokenFilters":["lowercase"]
  }
],
"tokenizers":[],
"charFilters": [],
"tokenFilters": []
}

Hinweis

Der Tokenizer keyword_v2 und der Tokenfilter lowercase sind dem System bekannt, und es werden die entsprechenden Standardkonfigurationen verwendet. Daher können Sie darauf anhand des Namens verweisen, ohne sie zuerst definieren zu müssen.

4 – Erstellen und Testen

Nachdem Sie einen Index mit Analysetools und Felddefinitionen definiert haben, die Ihr Szenario unterstützen, laden Sie Dokumente mit repräsentativen Zeichenfolgen, sodass Sie Abfragen von Teilzeichenfolgen testen können.

Verwenden Sie einen REST-Client, um Teilbenennungen und Sonderzeichen abzufragen, die in diesem Artikel beschrieben werden.

In den vorherigen Abschnitten wurde die Logik erläutert. In diesem Abschnitt werden die einzelnen APIs erläutert, die beim Testen der Lösung aufgerufen werden sollten.

  • Löschen des Index: Entfernt einen vorhandenen Index mit demselben Namen, damit Sie ihn neu erstellen können.

  • Erstellen des Index: Erstellt die Indexstruktur für den Suchdienst. Diese enthält Analyesetooldefinitionen und -felder mit einer Analysetoolspezifikation.

  • Laden von Dokumenten: Importiert Dokumente, die dieselbe Struktur wie der Index aufweisen, sowie durchsuchbare Inhalte. Nach diesem Schritt kann der Index abgefragt oder getestet werden.

  • Testen des Analysetools wurde in Festlegen eines Analysetools beschrieben. Testen Sie einige der Zeichenfolgen im Index mithilfe verschiedener Analysetools, um zu verstehen, wie Ausdrücke tokenisiert werden.

  • Durchsuchen von Dokumenten: Erläutert, wie eine Abfrageanforderung mithilfe einfacher Syntax oder der vollständigen Lucene-Syntax für Platzhalter und reguläre Ausdrücke erstellt wird.

    Bei Abfragen von Teilausdrücken wie z. B. „3-6214“, um eine Entsprechung für „+ 1 (425) 703-6214“ zu finden, können Sie die einfache Syntax verwenden: search=3-6214&queryType=simple.

    Verwenden Sie für Infix- und Suffixabfragen wie z. B. „num“ oder „numerisch“, um eine Entsprechung für „alphanumerisch“ zu finden, die vollständige Lucene-Syntax und einen regulären Ausdruck: search=/.*num.*/&queryType=full

Optimieren von Präfix- und Suffixabfragen

Für den Abgleich von Prä- und Suffixen mit dem Standardanalysetool sind zusätzliche Abfragefeatures erforderlich. Präfixe erfordern eine Platzhaltersuche und Suffixe eine Suche mit regulären Ausdrücken. Beide Features können die Abfrageleistung verringern.

Im folgenden Beispiel wird ein EdgeNGramTokenFilter-Objekt hinzugefügt, um Prä- oder Suffixabgleiche zu beschleunigen. Token werden in 2-25 Zeichenkombinationen generiert, die Zeichen enthalten. Hier ist eine Beispielentwicklung von zwei bis sieben Token: MS, MSF, MSFT, MSFT/, MSFT/S, MSFT/SQ, MSFT/SQL. EdgeNGramTokenFilter erfordert einen side-Parameter, der bestimmt, aus welcher Seite der Zeichenfolge Zeichenkombinationen generiert werden. Verwenden Sie front für Präfixabfragen und back für Suffixabfragen.

Die zusätzliche Tokenisierung führt zu einem größeren Index. Wenn Sie über ausreichend Kapazität für den größeren Index verfügen, ist dieser Ansatz mit der schnelleren Reaktionszeit möglicherweise die beste Lösung.

{
"fields": [
  {
    "name": "accountNumber_prefix",
    "indexAnalyzer": "ngram_front_analyzer",
    "searchAnalyzer": "keyword",
    "type": "Edm.String",
    "searchable": true,
    "filterable": false,
    "retrievable": true,
    "sortable": false,
    "facetable": false
  },
  {
    "name": "accountNumber_suffix",
    "indexAnalyzer": "ngram_back_analyzer",
    "searchAnalyzer": "keyword",
    "type": "Edm.String",
    "searchable": true,
    "filterable": false,
    "retrievable": true,
    "sortable": false,
    "facetable": false
  }
],

"analyzers": [
  {
    "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
    "name":"ngram_front_analyzer",
    "charFilters":[],
    "tokenizer":"keyword_v2",
    "tokenFilters":["lowercase", "front_edgeNGram"]
  },
  {
    "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
    "name":"ngram_back_analyzer",
    "charFilters":[],
    "tokenizer":"keyword_v2",
    "tokenFilters":["lowercase", "back_edgeNGram"]
  }
],
"tokenizers":[],
"charFilters": [],
"tokenFilters": [
  {
    "@odata.type":"#Microsoft.Azure.Search.EdgeNGramTokenFilterV2",
    "name":"front_edgeNGram",
    "minGram": 2,
    "maxGram": 25,
    "side": "front"
  },
  {
    "@odata.type":"#Microsoft.Azure.Search.EdgeNGramTokenFilterV2",
    "name":"back_edgeNGram",
    "minGram": 2,
    "maxGram": 25,
    "side": "back"
  }
]
}

Um nach Kontonummern zu suchen, die mit 123 beginnen, können Sie die folgende Abfrage verwenden:

{
  "search": "123",
  "searchFields": "accountNumber_prefix"
}

Um nach Kontonummern zu suchen, die auf 456 enden, können Sie die folgende Abfrage verwenden:

{
  "search": "456",
  "searchFields": "accountNumber_suffix"
}

Nächste Schritte

In diesem Artikel wurde beschrieben, wie Analysetools sowohl Probleme bei Abfragen verursachen als auch zu deren Lösung beitragen können. Im nächsten Schritt soll genauer beschrieben werden, wie sich Analysetools auf die Indizierung und Abfrageverarbeitung auswirken.