Auf dieser Seite wird beschrieben, wie Sie Suchergebnisse für Volltextsuchen in Spanner sortieren.
Spanner unterstützt die Berechnung eines Themenwerts, der als Baustein für die Erstellung komplexer Rankingfunktionen dient. Anhand dieser Bewertungen wird die Relevanz eines Ergebnisses für eine Suchanfrage berechnet. Dabei werden die Häufigkeit des Suchbegriffs und andere anpassbare Optionen berücksichtigt.
Das folgende Beispiel zeigt eine sortierte Suche:
SELECT AlbumId
FROM Albums
WHERE SEARCH(AlbumTitle_Tokens, "fifth symphony")
ORDER BY SCORE(AlbumTitle_Tokens, "fifth symphony") DESC
Suchbegriffe mit der Funktion SCORE
bewerten
Die Funktion SCORE
berechnet einen Wert für jeden Suchbegriff und kombiniert dann die Werte. Die Punktzahl pro Begriff basiert grob auf der Begriffshäufigkeit – umgekehrte Dokumenthäufigkeit (TF/IDF). Die Bewertung ist eine Komponente der endgültigen Sortierung eines Eintrags. Bei der Abfrage wird er mit anderen Signalen kombiniert, z. B. der Aktualität, die den Aktualitätsbewertungswert beeinflusst.
In der aktuellen Implementierung ist der IDF-Teil von TF/IDF nur verfügbar, wenn enhance_query=>true
verwendet wird. Dabei wird die relative Häufigkeit von Wörtern anhand des gesamten Webkorpus berechnet, der von der Google Suche verwendet wird, und nicht anhand eines bestimmten Suchindexes. Wenn die R-Suchanfrage-Optimierung nicht aktiviert ist, wird bei der Bewertung nur die Komponenten „Begriffshäufigkeit“ (TF) verwendet. Das heißt, der IDF-Begriff ist auf „1“ gesetzt.
Die Funktion SCORE
gibt Werte zurück, die als Relevanzbewertungen dienen, anhand derer Spanner eine Sortierreihenfolge festlegt. Sie haben keine eigenständige Bedeutung. Je höher der Wert, desto besser die Übereinstimmung mit der Suchanfrage.
Normalerweise sind Argumente wie query
und enhance_query
für die Funktionen SEARCH
und SCORE
identisch, um für Konsistenz beim Abrufen und Rangieren zu sorgen.
Wir empfehlen, diese Argumente mit Abfrageparametern anstelle von Stringliteralen zu verwenden und dieselben Abfrageparameter in den Funktionen SEARCH
und SCORE
anzugeben.
Mehrere Spalten bewerten
Spanner verwendet die Funktion SCORE
, um jedes Feld einzeln zu bewerten. In der Abfrage werden diese einzelnen Bewertungen dann kombiniert. Eine gängige Methode ist es, die einzelnen Bewertungen zu summieren und dann gemäß den von Nutzern bereitgestellten Feldgewichten (die über SQL-Abfrageparameter angegeben werden) zu erhöhen.
In der folgenden Abfrage wird beispielsweise die Ausgabe von zwei SCORE
-Funktionen kombiniert:
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, @p1) AND SEARCH(Studio_Tokens, @p2)
ORDER BY SCORE(Title_Tokens, @p1) * @titleweight + SCORE(Studio_Tokens, @p2) * @studioweight
LIMIT 25
Im folgenden Beispiel werden zwei Boost-Parameter hinzugefügt:
- Die Aktualität (
FreshnessBoost
) erhöht die Punktzahl um(1 + @freshnessweight * GREATEST(0, 30 - DaysOld) / 30)
- Mit „Beliebtheit“ (
PopularityBoost
) wird der Wert durch Multiplikation mit dem Faktor(1 + IF(HasGrammy, @grammyweight, 0)
erhöht.
Der Operator WITH
wird verwendet, um die Lesbarkeit der Abfrage zu verbessern.
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, @p1) AND SEARCH(Studio_Tokens, @p2)
ORDER BY WITH(
TitleScore AS SCORE(Title_Tokens, @p1) * @titleweight,
StudioScore AS SCORE(Studio_Tokens, @p2) * @studioweight,
DaysOld AS (UNIX_MICROS(CURRENT_TIMESTAMP()) - ReleaseTimestamp) / 8.64e+10,
FreshnessBoost AS (1 + @freshnessweight * GREATEST(0, 30 - DaysOld) / 30),
PopularityBoost AS (1 + IF(HasGrammy, @grammyweight, 0)),
(TitleScore + StudioScore) * FreshnessBoost * PopularityBoost)
LIMIT 25
TOKENLIST_CONCAT
kann sowohl bei der Suche als auch bei der Bewertung verwendet werden, um Abfragen bei Bedarf zu vereinfachen:
SELECT AlbumId
FROM Albums
WHERE SEARCH(TOKENLIST_CONCAT([Title_Tokens, Studio_Tokens]), @p)
ORDER BY SCORE(TOKENLIST_CONCAT([Title_Tokens, Studio_Tokens]), @p)
LIMIT 25
Abfolge der Suchanfragen optimieren
Spanner erhöht die Ausgabe der SCORE
-Funktion für Werte, die die Suchbegriffe in derselben Reihenfolge enthalten, in der sie in der Abfrage erscheinen, um einen Multiplikator. Es gibt zwei Versionen dieses Boosts: teilweise Übereinstimmung und genaue Übereinstimmung. Ein teilweiser Abgleich wird angewendet, wenn:
TOKENLIST
enthält alle ursprünglichen Begriffe in der Abfrage.- Die Tokens sind nebeneinander und in derselben Reihenfolge wie in der Abfrage.
Für Konjunktionen, Negationen und Wortgruppen gelten bestimmte Sonderregeln:
- Eine Suchanfrage mit einer Verneinung kann keinen Zuschlag für teilweise Übereinstimmungen erhalten.
- Eine Suchanfrage mit einer Konjunktion wird gesteigert, wenn ein Teil der Konjunktion an den entsprechenden Stellen erscheint.
- Eine Suchanfrage mit einer Wortgruppe wird optimiert, wenn die Wortgruppe in der
TOKENLIST
enthalten ist und der Begriff links von der Wortgruppe in der Suchanfrage links von der Wortgruppe in derTOKENLIST
steht. Gleiches gilt für den Begriff rechts von der Wortgruppe.
Spanner wendet einen Zuschlag für die genaue Übereinstimmung an, wenn alle vorherigen Regeln wahr sind und das erste und das letzte Token in der Abfrage das erste und das letzte Token im Dokument sind.
Beispieldokument: Bridge Over Troubled Water
Abfrage | Booster angewendet |
---|---|
Bridge Troubled | ohne Steigerung |
Brücke über – anderes Gewässer | ohne Steigerung |
Brücke (über OR unruhiges) Wasser | ohne Steigerung |
Bridge Over | Teilweise Steigerung |
Brücke über (bewegtes Wasser ODER Wasser) | Teilweise Steigerung |
Bridge Over Troubled Water | Steigerung bei genau passenden Keywords |
Brücke „über unruhiges Wasser“ | Steigerung bei genau passenden Keywords |
Brücke („Über stürmisches“ ODER missingterm) Wasser | Steigerung bei genau passenden Keywords |
Tiefe der Datenabfrage begrenzen
Suchindexe enthalten oft Millionen von Dokumenten. Bei Abfragen, bei denen die Prädikate eine geringe Selektivität haben, ist es nicht sinnvoll, alle Ergebnisse zu sortieren. Für Bewertungsanfragen gelten in der Regel zwei Limits:
- Retrieval depth limit (Limit für die Abruftiefe): Die maximale Anzahl der Zeilen, die bewertet werden sollen.
- Größenlimit für Ergebnissatz: Die maximale Anzahl von Zeilen, die die Abfrage zurückgeben soll (in der Regel die Seitengröße).
Mit SQL-Unterabfragen können Sie die Abruftiefe von Abfragen einschränken:
SELECT *
FROM (
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, @p1)
ORDER BY ReleaseTimestamp DESC
LIMIT @retrieval_limit
)
ORDER BY SCORE(Title_Tokens, @p1)
LIMIT @page_size
Das funktioniert besonders gut, wenn Spanner das wichtigste Ranking-Signal zum Sortieren des Index verwendet.
Nächste Schritte
- Weitere Informationen zu Abfragen für die Volltextsuche
- Weitere Informationen zur Teilstringsuche
- Weitere Informationen zur Paginierung von Suchergebnissen
- Weitere Informationen zum Kombinieren von Volltext- und Nicht-Textabfragen
- Weitere Informationen zur Suche in mehreren Spalten