Auf dieser Seite wird beschrieben, wie Sie eine Suche durchführen, bei der Volltext- und Nicht-Text-Daten kombiniert werden.
Kombinierte Volltext- und Nicht-Text-Suche durchführen
Suchindexe unterstützen
Volltext-, Exact Match-, numerische und JSON/JSONB-Spalten. Sie können Text- und Nicht-Text-Bedingungen in der WHERE-Anweisung ähnlich wie bei Suchanfragen mit mehreren Spalten kombinieren. Die Abfrageoptimierung versucht, Nicht-Text-Prädikate mit einem Suchindex zu optimieren. Wenn das nicht möglich ist, wertet Spanner die Bedingung für jede Zeile aus, die mit dem Suchindex übereinstimmt. Referenzierte Spalten, die nicht im Suchindex gespeichert sind, werden aus der Basistabelle abgerufen.
Dazu ein Beispiel:
GoogleSQL
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);
PostgreSQL
Die PostgreSQL-Unterstützung von Spanner unterliegt den folgenden Einschränkungen:
- Die Funktion
spanner.tokenize_numberunterstützt nur den Typbigint. spanner.tokenunterstützt keine Tokenisierung von Arrays.
CREATE TABLE albums (
albumid character varying NOT NULL,
title character varying,
rating bigint,
genres character varying NOT NULL,
likes bigint,
cover bytea,
title_tokens spanner.tokenlist AS (spanner.tokenize_fulltext(title)) VIRTUAL HIDDEN,
rating_tokens spanner.tokenlist AS (spanner.tokenize_number(rating)) VIRTUAL HIDDEN,
genres_tokens spanner.tokenlist AS (spanner.token(genres)) VIRTUAL HIDDEN,
PRIMARY KEY(albumid));
CREATE SEARCH INDEX albumsindex
ON albums(title_tokens, rating_tokens, genres_tokens)
INCLUDE (likes);
Das Verhalten von Abfragen für diese Tabelle umfasst Folgendes:
RatingundGenressind im Suchindex enthalten. Spanner beschleunigt Bedingungen mithilfe von Postinglisten für Suchindexe.ARRAY_INCLUDES_ANYundARRAY_INCLUDES_ALLsind GoogleSQL-Funktionen und werden für den PostgreSQL-Dialekt nicht unterstützt.SELECT Album FROM Albums WHERE Rating > 4 AND ARRAY_INCLUDES_ANY(Genres, ['jazz'])Die Abfrage kann Konjunktionen, Disjunktionen und Negationen beliebig kombinieren, einschließlich der Kombination von Volltext- und Nicht-Text-Prädikaten. Diese Abfrage wird vollständig durch den Suchindex beschleunigt.
SELECT Album FROM Albums WHERE (SEARCH(Title_Tokens, 'car') OR Rating > 4) AND NOT ARRAY_INCLUDES_ANY(Genres, ['jazz'])Likeswird im Index gespeichert, aber das Schema fordert Spanner nicht auf, einen Tokenindex für die möglichen Werte zu erstellen. Daher wird das Volltext-Prädikat fürTitleund das Nicht-Text-Prädikat fürRatingbeschleunigt, das Prädikat fürLikesjedoch nicht. In Spanner ruft die Abfrage alle Dokumente mit dem Begriff „car“ inTitleund einer Bewertung von mehr als 4 ab und filtert dann Dokumente heraus, die nicht mindestens 1.000 Likes haben. Diese Abfrage verbraucht viele Ressourcen, wenn fast alle Alben den Begriff „car“ im Titel und fast alle eine Bewertung von 5 haben, aber nur wenige Alben 1.000 Likes haben. In solchen Fällen spart das Indexieren vonLikesähnlich wie beiRatingRessourcen.GoogleSQL
SELECT Album FROM Albums WHERE SEARCH(Title_Tokens, 'car') AND Rating > 4 AND Likes >= 1000PostgreSQL
SELECT album FROM albums WHERE spanner.search(title_tokens, 'car') AND rating > 4 AND likes >= 1000Coverwird nicht im Index gespeichert. Die folgende Abfrage führt einen Back-Join zwischenAlbumsIndexundAlbumsaus, umCoverfür alle übereinstimmenden Alben abzurufen.GoogleSQL
SELECT AlbumId, Cover FROM Albums WHERE SEARCH(Title_Tokens, 'car') AND Rating > 4PostgreSQL
SELECT albumid, cover FROM albums WHERE spanner.search(title_tokens, 'car') AND rating > 4
Nächste Schritte
- Weitere Informationen zu Volltextsuchanfragen
- Informationen zum Ranking von Suchergebnissen
- Informationen zum Ausführen einer Teilstringsuche.
- Informationen zum Paginieren von Suchergebnissen
- Erfahren Sie, wie Sie mehrere Spalten durchsuchen.