Auf dieser Seite wird beschrieben, wie Sie eine Suche ausführen, bei der Volltext- und Nicht-Textdaten kombiniert werden.
Gemischte Volltext- und Nicht-Textsuche durchführen
Unterstützung für Suchindexe
Volltext-, genau passende und numerische Spalten. Ähnlich wie bei Suchanfragen mit mehreren Spalten können Sie in der WHERE
-Klausel Text- und Nicht-Textbedingungen kombinieren. Der Abfrageoptimierer versucht, Prädikate ohne Text mit einem Suchindex zu optimieren. Wenn
die unmöglich ist, wertet Spanner die Bedingung für jede Zeile aus,
der mit dem Suchindex übereinstimmt. Auf Spalten, die nicht im Suchindex gespeichert sind, wird aus der Basistabelle zugegriffen.
Betrachten Sie dazu beispielsweise das folgende Beispiel:
CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
Title STRING(MAX),
Rating FLOAT64,
Genres ARRAY<STRING(MAX)>,
Likes INT64,
Cover BYTES(MAX),
Title_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Title)) HIDDEN,
Rating_Tokens TOKENLIST AS (TOKENIZE_NUMBER(Rating)) HIDDEN,
Genres_Tokens TOKENLIST AS (TOKEN(Genres)) HIDDEN
) PRIMARY KEY(AlbumId);
CREATE SEARCH INDEX AlbumsIndex
ON Albums(Title_Tokens, Rating_Tokens, Genres_Tokens)
STORING Likes;
Das Verhalten von Abfragen für diese Tabelle ist unter anderem:
Rating
undGenres
sind im Suchindex enthalten. Spanner beschleunigt Bedingungen durch das Posten von Suchindexen Listen.SELECT Album FROM Albums WHERE Rating > 4 AND ARRAY_INCLUDES_ANY(Genres, ['jazz'])
Die Abfrage kann Konjunktionen, Disjunktionen und Negationen auf beliebige Weise kombinieren, einschließlich Volltext- und Nicht-Text-Prädikaten. Diese Abfrage wird durch den Suchindex vollständig beschleunigt.
SELECT Album FROM Albums WHERE (SEARCH(Title_Tokens, 'car') OR Rating > 4) AND NOT ARRAY_INCLUDES_ANY(Genres, ['jazz'])
Likes
ist im Index gespeichert, aber das Schema fordert keine Anfrage an Spanner einen Tokenindex für seine möglichen Werte zu erstellen. Daher wird das Volltextprädikat aufTitle
und das Nicht-Text-Prädikat aufRating
wird beschleunigt, das Prädikat aufLikes
jedoch nicht. In Spanner werden mit der Abfrage alle Dokumente mit dem Begriff „Auto“ in derTitle
abgerufen, die eine Bewertung von über 4 erhalten haben. Anschließend werden Dokumente herausgefiltert, die nicht mindestens 1.000 „Mag ich“-Bewertungen haben. Diese Abfrage verbraucht viele Ressourcen, Alle Alben enthalten den Begriff "Auto" und fast alle haben eine Bewertung von 5, aber nur wenige Alben haben 1000 positive Bewertungen. In solchen Fällen kann die IndexierungLikes
ähnlich wieRating
spart Ressourcen.SELECT Album FROM Albums WHERE SEARCH(Title_Tokens, 'car') AND Rating > 4 AND Likes >= 1000
Cover
ist nicht im Index gespeichert. Die folgende Abfrage führt einen Back-Join zwischenAlbumsIndex
undAlbums
aus, umCover
für alle übereinstimmenden Alben abzurufen.SELECT AlbumId, Cover FROM Albums WHERE SEARCH(Title_Tokens, 'car') AND Rating > 4
Nächste Schritte
- Weitere Informationen zu Volltextsuchanfragen
- Weitere Informationen zum Ranking von Suchergebnissen
- Weitere Informationen zur Teilstringsuche
- Weitere Informationen zur Paginierung von Suchergebnissen
- Weitere Informationen zur Suche in mehreren Spalten