Gestalten von Ergebnissen in Azure KI-Suche
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
- Paging
- 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 aus, die die Unterschiede zwischen Dokumenten zeigen und so genügend Informationen liefern, um 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=2024-07-01
{
"search": "sandy beaches",
"select": "HotelId, HotelName, Description, Rating, Address/City",
"count": true
}
Tipps zu unerwarteten Ergebnissen
Manchmal entspricht die Abfrageausgabe nicht Ihren Erwartungen. 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) insearchMode=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 obere Grenze beträgt 1.000 Dokumente, die pro Seite mit Suchergebnissen zurückgegeben werden. Daher können Sie maximal 1.000 Dokumente festlegen, die im ersten Ergebnis zurückgegeben werden. Wenn Sie eine Hybridabfrage verwenden, können Sie in neueren Vorschau-APIs maxTextRecallSize angeben, um bis zu 10.000 Dokumente zurückzugeben.
Um die Paginierung aller in einem Resultset zurückgegebenen Dokumente zu steuern, fügen Sie einer GET-Anforderung die Parameter $top
und $skip
und einer POST-Anforderung die Parameter top
und skip
hinzu. 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.
Führen Sie eine Abfrage aus, um eine ganze Seite sortierter Ergebnisse zurückzugeben.
POST /indexes/good-books/docs/search?api-version=2024-07-01 { "search": "divine secrets", "top": 50, "orderby": "id asc" }
Wählen Sie das letzte Ergebnis aus, das von der Suchabfrage zurückgegeben wird. Im Folgenden finden Sie ein Beispielresultset mit nur einem ID-Wert.
{ "id": "50" }
Verwenden Sie diesen ID-Wert in einer Bereichsabfrage, um die nächste Seite mit Ergebnissen abzurufen. Dieses ID-Feld sollte eindeutige Werte enthalten, da andernfalls die Paginierung doppelte Ergebnisse enthalten kann.
POST /indexes/good-books/docs/search?api-version=2024-07-01 { "search": "divine secrets", "top": 50, "orderby": "id asc", "filter": "id ge 50" }
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 den semantischen Sortierer 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.
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 klein geschriebenen Tokenizers in einem Feld hat keine Auswirkungen auf das Sortierverhalten, da Azure KI-Suche 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
oderCollection(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=2024-07-01
{
"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.
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=2024-07-01
{
"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:
Mit Demo-App erstellen im Portal können Sie eine HTML-Seite mit einer Suchleiste, einer Facettennavigation und einem Ergebnisbereich erstellen.
Hinzufügen der Suche zu einer ASP.NET Core (MVC) App ist ein Tutorial und Codebeispiel, mit dem Sie einen funktionierenden Client erstellen können.
Hinzufügen von Suchfunktionen zu Web-Apps ist ein Tutorial und Codebeispiel, in dem React-JavaScript-Bibliotheken für die Benutzererfahrung verwendet werden. Die App wird mithilfe von Azure Static Web Apps bereitgestellt.