Viele Anwendungen fragen eine Datenbank ab, um Anwendungen. In solchen Anwendungen benötigt die Anwendung nicht alle Übereinstimmungen, sondern nur die Top-K-Übereinstimmungen basierend auf der Indexsortierung. Indexe suchen diese Art der Suche sehr effizient implementieren. Auf dieser Seite wird beschrieben, wie Sie einen Index mit Top-K-Abgleich erstellen und darin suchen.
Suchindexe für die Top-K-Übereinstimmungen erstellen
Zum Konfigurieren eines Suchindex für den Top-K-Abgleich verwenden Sie ORDER BY
, um die
nach einer bestimmten Spalte suchen. Abfragen müssen eine ORDER BY
-Klausel enthalten
die genau mit der Sortierreihenfolge des Suchindex übereinstimmt (einschließlich aufsteigender
absteigend) und einer LIMIT
-Klausel, die die Abfrage anfordert,
der Suche nach k-übereinstimmenden Zeilen.
Sie können die Paginierung auch mithilfe dieser Klauseln implementieren. Weitere Informationen finden Sie unter Suchanfragen paginatisieren.
In einigen Anwendungsfällen kann es sinnvoll sein, mehrere Suchindexe zu verwalten. die nach verschiedenen Spalten sortiert sind. Gefällt mir Partitionierung, ist es ein Kompromiss zwischen Speicher- und Schreibkosten und Abfragelatenz.
Betrachten Sie beispielsweise eine Tabelle mit dem folgenden Schema:
CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
RecordTimestamp INT64 NOT NULL,
ReleaseTimestamp INT64 NOT NULL,
ListenTimestamp INT64 NOT NULL,
AlbumTitle STRING(MAX),
AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(AlbumTitle)) HIDDEN
) PRIMARY KEY(AlbumId);
CREATE SEARCH INDEX AlbumsRecordTimestampIndex
ON Albums(AlbumTitle_Tokens, SingerId_Tokens)
ORDER BY RecordTimestamp DESC
STORING ListenTimestamp
CREATE SEARCH INDEX AlbumsReleaseTimestampIndex
ON Albums(AlbumTitle_Tokens)
ORDER BY ReleaseTimestamp DESC
STORING ListenTimestamp
Suchindexe nach den Top-K-Übereinstimmungen abfragen
Wie bereits erwähnt, müssen Abfragen eine ORDER BY
-Klausel enthalten, die genau mit der Sortierreihenfolge des Suchindexes übereinstimmt (einschließlich aufsteigender oder absteigender Richtung), und eine LIMIT
-Klausel, die angibt, dass die Abfrage beendet werden soll, nachdem k übereinstimmende Zeilen gefunden wurden.
Im Folgenden sind einige häufig gestellte Suchanfragen aufgeführt:
Die folgende Abfrage ist sehr effizient. Sie wählt die
AlbumsRecordTimestampIndex
-Index. Auch wenn es viele Alben mit Wort "glücklich" verwendet, durchsucht die Abfrage nur eine kleine Anzahl von Zeilen:SELECT AlbumId FROM Albums WHERE SEARCH(AlbumTitle_Tokens, 'happy') ORDER BY RecordTimestamp DESC LIMIT 10
Dieselbe Abfrage, wodurch eine Sortierreihenfolge in absteigender Reihenfolge nach
ReleaseTimestamp
angefordert wird verwendet den IndexAlbumsReleaseTimestampIndex
und ist gleich effizient:SELECT AlbumId FROM Albums WHERE SEARCH(AlbumTitle_Tokens, 'happy') ORDER BY ReleaseTimestamp DESC LIMIT 10
Gleichzeitig wird bei einer Abfrage, die eine Sortierfolge nach
ListenTimestamp
anfordert, Top-K-Abfrage effizient ausführen. Es muss alle übereinstimmenden Alben abrufen, nachListenTimestamp,
sortieren und die Top 10 zurückgeben. Eine solche Abfrage verwendet mehr Ressourcen, wenn es eine große Anzahl von Dokumenten gibt, die den Begriff „glücklich“.SELECT AlbumId FROM Albums WHERE SEARCH(AlbumTitle_Tokens, 'happy') ORDER BY ListenTimestamp DESC LIMIT 10`
Ebenso wird eine Abfrage nicht effizient ausgeführt, wenn die Ergebnisse in aufsteigender Reihenfolge nach der Spalte
RecordTimestamp
sortiert werden sollen. Es scannt alles Zeilen mit dem Wort "glücklich", obwohl einLIMIT
vorhanden ist.SELECT AlbumId FROM Albums WHERE SEARCH(AlbumTitle_Tokens, 'happy') ORDER BY RecordTimestamp ASC LIMIT 10
Nächste Schritte
- Weitere Informationen zu Volltextsuchanfragen
- Weitere Informationen zum Ranking von Suchergebnissen
- Weitere Informationen zur Paginierung von Suchergebnissen
- Volltext- und Nicht-Text-Abfragen kombinieren
- Weitere Informationen zur Suche in mehreren Spalten