Arbeiten mit Suchergebnissen in Azure KI Search

In diesem Artikel erfahren Sie, wie Sie eine Abfrageantwort in Azure KI Search verwenden. Die Struktur einer Antwort wird durch Parameter in der Abfrage bestimmt. Weitere Informationen hierzu finden Sie unter Durchsuchen von Dokumenten (REST) bzw. unter Klasse „SearchResults“ (Azure für .NET).

Die Abfrageparameter haben Einfluss auf Folgendes:

  • Feldauswahl
  • Anzahl der Übereinstimmungen, die im Index für die Abfrage gefunden wurden
  • Auslagerungsergebnisse
  • Anzahl von Ergebnissen in der Antwort (standardmäßig bis zu 50)
  • Sortierreihenfolge
  • Hervorhebung von Begriffen innerhalb eines Ergebnisses (Abgleich entweder des gesamten Ausdrucks oder eines Teils des Ausdrucks im Text)

Ergebniszusammensetzung

Ergebnisse sind tabellarisch und bestehen aus Feldern, die entweder alle Felder vom Typ „retrievable“ enthalten oder auf die in den $select-Parametern angegebenen Felder beschränkt sind. Zeilen sind die übereinstimmenden Dokumente.

Sie können auswählen, welche Felder in Suchergebnissen enthalten sind. Ein Suchdokument kann zwar eine Vielzahl an Feldern haben, werden in der Regel jedoch nur wenige zur Darstellung der einzelnen Dokumente in den Ergebnissen benötigt. Fügen Sie bei einer Abfrageanforderung $select=<field list> an, um anzugeben, welche „abrufbaren“ Felder in der Antwort erscheinen sollen.

Wählen Sie Felder, welche die Unterschiede zwischen Dokumenten zeigen und so genügend Informationen liefern, um den Benutzer zu einer Antwort durch Klicken einzuladen. Auf einer E-Commerce-Website kann dies ein Produktname, eine Beschreibung, eine Marke, eine Farbe, eine Größe, ein Preis oder eine Bewertung sein. Bei dem integrierten Beispiel „hotels-sample-index“ können dies die „select“-Felder im folgenden Beispiel sein:

POST /indexes/hotels-sample-index/docs/search?api-version=2020-06-30 
    {  
      "search": "sandy beaches",
      "select": "HotelId, HotelName, Description, Rating, Address/City"
      "count": true
    }

Hinweis

Für Bilddateien in Ergebnissen, wie etwa ein Produktfoto oder ein Logo, speichern Sie diese außerhalb von Azure KI Search. Fügen Sie jedoch ein Feld zu Ihrem Index hinzu, das auf die Bild-URL im Suchdokument verweist. Zu Beispielindizes, welche die Bildunterstützung in den Ergebnissen demonstrieren, zählen die Demo realestate-sample-us (ein integriertes Beispieldataset, das problemlos mithilfe des Datenimport-Assistenten erstellt werden kann) und die Demo-App New York City Jobs.

Tipps zu unerwarteten Ergebnissen

Es kann vorkommen, dass der Inhalt und nicht die Struktur der Ergebnisse unerwartet ist. Beispielsweise bemerken Sie möglicherweise, dass einige Ergebnisse anscheinend Duplikate sind, oder ein Ergebnis, das in der Nähe des oberen Rands angezeigt werden sollte, in den Ergebnissen niedriger positioniert wird. Wenn die Abfrageergebnisse nicht wie erwartet ausfallen, können Sie es mit diesen Änderungen der Abfragen versuchen, um zu ermitteln, ob sich die Ergebnisqualität verbessert:

  • Ändern Sie searchMode=any (Standard) in searchMode=all, damit Übereinstimmungen mit allen Kriterien erforderlich sind, nicht nur mit einem oder mehreren Kriterien. Dies gilt besonders, wenn die Abfrage boolesche Operatoren enthält.

  • Experimentieren Sie mit verschiedenen lexikalischen oder benutzerdefinierten Analysetools, um festzustellen, ob sich das Abfrageergebnis ändert. Das Standardanalysetool unterbricht Wörter mit Bindestrichen und reduziert die Wörter auf ihre Stammformen. Dadurch wird die Stabilität einer Abfrageantwort in der Regel verbessert. Wenn Sie jedoch Bindestriche beibehalten müssen oder wenn die Zeichenfolgen Sonderzeichen enthalten, müssen Sie eventuell benutzerdefinierte Analysetools konfigurieren, um sicherzustellen, dass der Index Token im richtigen Format enthält. Weitere Informationen finden Sie unter Suche nach Teilausdrücken und Mustern mit Sonderzeichen (Bindestriche, Platzhalter, reguläre Ausdrücke, Muster).

Zählen von Übereinstimmungen

Der count-Parameter gibt die Anzahl der Dokumente im Index zurück, die als Übereinstimmung für die Abfrage betrachtet werden. Um die Anzahl zurückzugeben, fügen Sie der Abfrageanforderung $count=true hinzu. Es gibt keinen vom Suchdienst vorgegebenen Höchstwert. Abhängig von Ihrer Abfrage und dem Inhalt Ihrer Dokumente kann die Anzahl alle im Index enthaltenen Dokumente umfassen.

Die Anzahl ist genau, wenn der Index stabil ist. Wenn das System Dokumente aktiv hinzufügt, aktualisiert oder löscht, wird eine ungefähre Anzahl angegeben. Nicht vollständig indizierte Dokumente werden dabei ausgeschlossen.

Die Anzahl wird nicht durch Routinewartungen oder andere Workloads im Suchdienst beeinflusst. Wenn Sie jedoch über mehrere Partitionen und ein einzelnes Replikat verfügen, können kurzfristige Schwankungen bei der Dokumentzählung (mehrere Minuten) auftreten, da die Partitionen neu gestartet werden.

Tipp

Zum Überprüfen von Indizierungsvorgängen können Sie sich vergewissern, dass der Index die erwartete Anzahl von Dokumenten enthält, indem Sie einer leeren search=*-Suchabfrage $count=true hinzufügen. Das Ergebnis ist die vollständige Anzahl von Dokumenten in Ihrem Index.

Beim Testen der Abfragesyntax können Sie mithilfe von $count=true schnell feststellen, ob Ihre Änderungen mehr oder weniger Ergebnisse zurückgeben. Dieses Feedback kann hilfreich sein.

Auslagerungsergebnisse

Standardmäßig werden von der Suchmaschine die ersten 50 Treffer zurückgegeben. Bei einer Volltextsuche oder einer semantischen Suche werden die ersten 50 Treffer anhand der Suchbewertung bestimmt. Bei Abfragen mit exakter Übereinstimmung (wobei ein gleichmäßiger "@searchScore=1.0" auf eine beliebige Rangfolge hindeutet) werden die ersten 50 Treffer hingegen in beliebiger Reihenfolge zurückgegeben.

Die Kachelverwaltung aller in einem Resultset zurückgegebenen Dokumente kann durch Hinzufügen der Parameter $top und $skip zur GET-Abfrageanforderung oder top und skip zur POST-Abfrageanforderung gesteuert werden. In der folgenden Liste wird die Logik erläutert.

  • Damit wird die erste Gruppe von 15 übereinstimmenden Dokumenten sowie die Gesamtzahl der Übereinstimmungen zurückgegeben: GET /indexes/<INDEX-NAME>/docs?search=<QUERY STRING>&$top=15&$skip=0&$count=true

  • Damit wird die zweite Gruppe zurückgegeben, wobei die ersten 15 übersprungen und die nächsten 15 abgerufen werden: $top=15&$skip=15. Wiederholen Sie den Vorgang für die dritte 15er Gruppe: $top=15&$skip=30

Es ist nicht sicher, dass die Ergebnisse von paginierten Abfragen stabil sind, wenn sich der zugrunde liegende Index ändert. Beim Paging ändert sich der Wert von $skip für die einzelnen Seiten. Dabei sind die einzelnen Abfragen jedoch unabhängig und werden für die aktuelle Ansicht der Daten ausgeführt, die im Index zur Abfragezeit vorhanden sind. (Das bedeutet, es gibt kein Zwischenspeichern bzw. keine Momentaufnahmen der Ergebnisse wie etwa bei universellen Datenbanken.)

Mit dem folgenden Beispiel werden möglicherweise Duplikate zurückgegeben. Stellen Sie sich einen Index mit vier Dokumenten vor:

{ "id": "1", "rating": 5 }
{ "id": "2", "rating": 3 }
{ "id": "3", "rating": 2 }
{ "id": "4", "rating": 1 }

Stellen Sie sich nun vor, es sollen immer je zwei Ergebnisse nach Bewertung sortiert zurückgegeben werden. Sie würden die folgende Abfrage ausführen, um die erste Seite mit Ergebnissen abzurufen: $top=2&$skip=0&$orderby=rating desc. Damit werden die folgenden Ergebnisse erzeugt:

{ "id": "1", "rating": 5 }
{ "id": "2", "rating": 3 }

Stellen Sie sich nun vor, dass bei dem Dienst zwischen den Abfragen { "id": "5", "rating": 4 } als fünftes Dokument in den Index aufgenommen wird. Kurze Zeit später führen Sie eine Abfrage aus, um die zweite Seite abzurufen: $top=2&$skip=2&$orderby=rating desc. Damit werden die folgenden Ergebnisse abgerufen:

{ "id": "2", "rating": 3 }
{ "id": "3", "rating": 2 }

Wie Sie sehen, wurde Dokument 2 zweimal abgerufen. Der Grund dafür ist, dass das neue Dokument 5 einen größeren Wert für die Bewertung aufweist, sodass es in der Reihenfolge vor Dokument 2 kommt und daher auf der ersten Seite landet. Dieses Verhalten ist zwar möglicherweise unerwartet, jedoch typisch für das Verhalten eines Suchmoduls.

Kachelverwaltung durch eine große Anzahl von Ergebnissen

Die Verwendung von $top und $skip ermöglicht es einer Suchabfrage, bis zu 100.000 Ergebnisse in Seiten einzuteilen, aber was ist, wenn es mehr als 100.000 Ergebnisse sind? Verwenden Sie eine Sortierreihenfolge und Bereichsfilter als Workaround für$skip, wenn Sie eine Antwort dieser Größe in Seiten einteilen möchten.

Bei diesem Workaround werden Sortierung und Filter auf ein Dokument-ID-Feld oder ein anderes Feld angewendet, das für jedes Dokument eindeutig ist. Das eindeutige Feld muss filterable und sortable Zuordnung im Suchindex aufweisen.

  1. Führen Sie eine Abfrage aus, um eine ganze Seite sortierter Ergebnisse zurückzugeben.

    POST /indexes/good-books/docs/search?api-version=2020-06-30
        {  
          "search": "divine secrets",
          "top": 50,
          "orderby": "id asc"
        }
    
  2. Wählen Sie das letzte Ergebnis aus, das von der Suchabfrage zurückgegeben wird. Hier wird ein Beispielergebnis mit nur einem "id"-Wert angezeigt.

    {
        "id": "50"
    }
    
  3. Verwenden Sie diesen "id"-Wert in einer Bereichsabfrage, um die nächste Seite mit Ergebnissen abzurufen. Dieses "id"-Feld sollte eindeutige Werte aufweisen, andernfalls kann der Seitenumbruch doppelte Ergebnisse enthalten.

    POST /indexes/good-books/docs/search?api-version=2020-06-30
        {  
          "search": "divine secrets",
          "top": 50,
          "orderby": "id asc",
          "filter": "id ge 50"
        }
    
  4. Der Seitenumbruch endet, wenn die Abfrage null Ergebnisse zurückgibt.

Hinweis

Die Attribute "filterbar" und "sortierbar" können nur aktiviert werden, wenn ein Feld erstmalig zu einem Index hinzugefügt wird, sie können nicht für ein vorhandenes Feld aktiviert werden.

Reihenfolge von Ergebnissen

In einer Volltextsuchabfrage können die Ergebnisse wie folgt priorisiert werden:

  • eine Suchbewertung
  • eine semantische Reranker-Bewertung
  • eine Sortierreihenfolge für ein "sortierbares" Feld

Sie können auch alle Übereinstimmungen in bestimmten Feldern erhöhen, indem Sie ein Bewertungsprofil hinzufügen.

Nach Suchbewertung sortieren

Bei Volltextsuchabfragen werden Ergebnisse automatisch nach einer Suchbewertung geordnet, die basierend auf Begriffshäufigkeit und -nähe berechnet wird (abgeleitet von TF-IDF), wobei Dokumente mit mehr oder stärkeren Übereinstimmungen bei einem Suchbegriff höher bewertet werden.

Der "@search.score"-Bereich ist entweder ungebunden oder 0 bis (aber nicht einschließlich) 1.00 für ältere Dienste.

Für beide Algorithmen steht eine Suchbewertung vom Typ „@search.score“ mit dem Wert „1.00“ für ein nicht bewertetes oder unsortiertes Resultset, bei dem die Bewertung von 1.0 für alle Ergebnisse gleich ist. Nicht bewertete Ergebnisse kommen vor, wenn es sich um eine Fuzzysuche, um eine Abfrage mit Platzhaltern oder regulären Ausdrücken oder um eine leere Suche (search=*) handelt. Falls Sie eine Rangfolgestruktur für nicht bewertete Ergebnisse auferlegen müssen, könnte ein $orderby Ausdruck dieses Ziel erreichen.

Sortieren nach der semantischen Neubewertung

Wenn Sie die semantische Rangfolge verwenden, bestimmt „@search.rerankerScore“ die Sortierreihenfolge Ihrer Ergebnisse.

Der Bereich „@search.rerankerScore“ beträgt 1 bis 4,00, wobei eine höhere Bewertung eine stärkere semantische Übereinstimmung angibt.

Sortieren mit $orderby

Wenn eine konsistente Reihenfolge eine Anforderung der Anwendung ist, können Sie explizit einen $orderby Ausdruck in einem Feld definieren. Nur Felder, die als „sortierbar“ indiziert sind, können zum Sortieren von Ergebnissen verwendet werden.

In $orderby werden häufig Felder wie Bewertung, Datum und Standort verwendet. Für die Filterung nach Standort muss zusätzlich zum Feldnamen auch die Funktion geo.distance() aufgerufen werden.

Numerische Felder (Edm.Double, Edm.Int32, Edm.Int64) werden in numerischer Reihenfolge sortiert (z. B. 1, 2, 10, 11, 20).

Zeichenfolgenfelder (Unterfelder Edm.String, Edm.ComplexType) werden je nach Sprache entweder in ASCII-Sortierreihenfolge oder Unicode-Sortierreihenfolge sortiert. Sie können keine Sammlungen beliebiger Typen sortieren.

  • Numerische Inhalte in Zeichenfolgenfeldern werden alphabetisch sortiert (1, 10, 11, 2, 20).

  • Zeichenfolgen in Großbuchstaben werden vor Kleinbuchstaben sortiert (APFEL, Apfel, BANANE, Banane, apfel, banane) sortiert. Sie können einen Textnormalisierer zuweisen, um den Text vor dem Sortieren zu verarbeiten und dieses Verhalten zu ändern. Die Verwendung des Kleinbuchstaben-Tokenizers in einem Feld hat keine Auswirkungen auf das Sortierverhalten, da Azure KI Search nach einer nicht analysierten Kopie des Felds sortiert.

  • Zeichenfolgen, die mit diakritischen Zeichen beginnen (Äpfel, Öffnen, Üben), werden zuletzt angezeigt.

Verbessern der Relevanz mithilfe eines Bewertungsprofils

Ein weiterer Ansatz für eine konsistente Reihenfolge ist die Verwendung eines benutzerdefinierten Bewertungsprofils. Mit Bewertungsprofilen haben Sie mehr Kontrolle über die Bewertung von Elementen in Suchergebnissen und können in bestimmten Feldern gefundene Übereinstimmungen aufwerten. Mithilfe der zusätzlichen Bewertungslogik können geringfügige Unterschiede zwischen Replikaten außer Kraft gesetzt werden, da die Suchbewertungen für die einzelnen Dokumente weiter auseinander liegen. Für diesen Ansatz wird der Rangfolgenalgorithmus empfohlen.

Treffermarkierung

Die Treffermarkierung bezieht sich auf die Textformatierung (wie Fett- oder Gelbmarkierung), die auf Treffer in einem Ergebnis angewendet werden, sodass die Übereinstimmungen leicht zu erkennen sind. Die Markierung eignet sich für längere Inhaltsfelder, z. B. ein Beschreibungsfeld, bei denen die Übereinstimmung nicht sofort ersichtlich ist.

Beachten Sie, dass Hervorhebung auf einzelne Ausdrücke angewendet wird. Es gibt keine Hervorhebungsfunktion für den Inhalt eines gesamten Felds. Wenn Sie einen Ausdruck hervorheben möchten, müssen Sie die übereinstimmenden Begriffe (oder Ausdrücke) in einer in Anführungszeichen eingeschlossenen Abfragezeichenfolge angeben. Diese Technik wird weiter unten in diesem Abschnitt beschrieben.

Anweisungen zur Treffermarkierung werden in der Abfrageanforderung bereitgestellt. Bei Abfragen, die eine Abfrageerweiterung in der Engine auslösen, wie z. B. Fuzzy- und Platzhaltersuche, wird die Treffermarkierung nur begrenzt unterstützt.

Anforderungen für die Trefferhervorhebung

  • Felder müssen Edm.String oder Collection(Edm.String) sein
  • Die Felder müssen das Attribut durchsuchbar aufweisen

Angeben der Hervorhebung in der Anforderung

Fügen Sie für die Rückgabe hervorgehobener Begriffe den Parameter „highlight“ in die Abfrageanforderung ein. Der Parameter wird auf eine durch Kommas getrennte Liste von Feldern festgelegt.

Standardmäßig ist die Formatmarkierung <em>, aber Sie können das Tag mithilfe der Parameter highlightPreTag und highlightPostTag überschreiben. Ihr Clientcode verarbeitet die Antwort (z. B. das Anwenden einer fett formatierten Schriftart oder eines gelben Hintergrunds).

POST /indexes/good-books/docs/search?api-version=2020-06-30 
    {  
      "search": "divine secrets",  
      "highlight": "title, original_title",
      "highlightPreTag": "<b>",
      "highlightPostTag": "</b>"
    }

Azure KI Search gibt standardmäßig bis zu fünf Markierungen pro Feld zurück. Sie können die Anzahl anpassen, indem Sie einen Bindestrich gefolgt von einer ganzen Zahl anfügen. "highlight": "description-10" gibt beispielsweise bis zu 10 hervorgehobene Begriffe zu übereinstimmenden Inhalten im Beschreibungsfeld zurück.

Hervorgehobene Ergebnisse

Wenn der Abfrage Hervorhebungen hinzugefügt werden, enthält die Antwort ein „@search.highlights“ für jedes Ergebnis, damit Ihr Anwendungscode diese Struktur als Ziel verwenden kann. Die Liste der für „highlight“ angegebenen Felder ist in der Antwort enthalten.

Bei einer Schlüsselwortsuche wird jeder Begriff unabhängig überprüft. Eine Abfrage für „göttliche Geheimnisse“ gibt Übereinstimmungen für jedes Dokument zurück, das einen der beiden Begriffe enthält.

Screenshot: Hervorhebung für eine Ausdrucksabfrage

Hervorhebung bei der Schlüsselwortsuche

Innerhalb eines hervorgehobenen Felds wird die Formatierung auf ganze Begriffe angewendet. Bei einer Übereinstimmung mit „Die göttlichen Geheimnisse der Ya-Ya-Schwestern“ wird die Formatierung beispielsweise auf jeden einzelnen Begriff angewandt, auch wenn sie aufeinanderfolgen.

"@odata.count": 39,
"value": [
    {
        "@search.score": 19.593246,
        "@search.highlights": {
            "original_title": [
                "<em>Divine</em> <em>Secrets</em> of the Ya-Ya Sisterhood"
            ],
            "title": [
                "<em>Divine</em> <em>Secrets</em> of the Ya-Ya Sisterhood"
            ]
        },
        "original_title": "Divine Secrets of the Ya-Ya Sisterhood",
        "title": "Divine Secrets of the Ya-Ya Sisterhood"
    },
    {
        "@search.score": 12.779835,
        "@search.highlights": {
            "original_title": [
                "<em>Divine</em> Madness"
            ],
            "title": [
                "<em>Divine</em> Madness (Cherub, #5)"
            ]
        },
        "original_title": "Divine Madness",
        "title": "Divine Madness (Cherub, #5)"
    },
    {
        "@search.score": 12.62534,
        "@search.highlights": {
            "original_title": [
                "Grave <em>Secrets</em>"
            ],
            "title": [
                "Grave <em>Secrets</em> (Temperance Brennan, #5)"
            ]
        },
        "original_title": "Grave Secrets",
        "title": "Grave Secrets (Temperance Brennan, #5)"
    }
]

Hervorhebung bei der Ausdruckssuche

Die Formatierung ganzer Begriffe gilt auch für eine Ausdruckssuche, bei der mehrere Begriffe in doppelte Anführungszeichen eingeschlossen werden. Das folgende Beispiel zeigt die gleiche Abfrage, mit dem Unterschied, dass die „göttliche Geheimnisse“ als in Anführungszeichen eingeschlossener Ausdruck übergeben wird (einige REST-Clients erfordern, dass Sie für die inneren Anführungszeichen einen umgekehrten Schrägstrich \" als Escapezeichen verwenden):

POST /indexes/good-books/docs/search?api-version=2020-06-30 
    {  
      "search": "\"divine secrets\"",,
      "select": "title,original_title",
      "highlight": "title",
      "highlightPreTag": "<b>",
      "highlightPostTag": "</b>",
      "count": true
    }

Da die Kriterien jetzt beide Begriffe enthalten, wird nur eine Übereinstimmung im Suchindex gefunden. Die Antwort auf die Abfrage oben sieht wie folgt aus:

{
    "@odata.count": 1,
    "value": [
        {
            "@search.score": 19.593246,
            "@search.highlights": {
                "title": [
                    "<b>Divine</b> <b>Secrets</b> of the Ya-Ya Sisterhood"
                ]
            },
            "original_title": "Divine Secrets of the Ya-Ya Sisterhood",
            "title": "Divine Secrets of the Ya-Ya Sisterhood"
        }
    ]
}

Ausdruckshervorhebung in älteren Diensten

Bei Suchdiensten, die vor dem 15. Juli 2020 erstellt wurden, unterscheidet sich die Hervorhebung für Ausdrucksabfragen.

In den folgenden Beispielen wird von einer Abfragezeichenfolge ausgegangen, die den in Anführungszeichen eingeschlossenen Ausdruck „Super Bowl“ enthält. Vor Juli 2020 wird jeder Begriff im Ausdruck hervorgehoben:

"@search.highlights": {
    "sentence": [
        "The <em>super</em> <em>bowl</em> is <em>super</em> awesome with a <em>bowl</em> of chips"
   ]

Für Suchdienste, die nach dem Juli 2020 erstellt wurden, werden in „@search.highlights“ nur Ausdrücke zurückgegeben, die mit der gesamten Ausdrucksabfrage übereinstimmen:

"@search.highlights": {
    "sentence": [
        "The <em>super</em> <em>bowl</em> is super awesome with a bowl of chips"
   ]

Nächste Schritte

Wenn Sie schnell eine Suchseite für Ihren Client erstellen möchten, probieren Sie die folgenden Optionen aus: