Auf dieser Seite wird beschrieben, wie Sie eine Suche ausführen, bei der Volltext- und Nicht-Textdaten kombiniert werden.
Eine gemischte Volltext- und Nicht-Text-Suche durchführen
Suchindexe unterstützen Volltext-, exakte Übereinstimmung, numerische Spalten und JSON-/JSONB-Spalten. Ähnlich wie bei Suchanfragen mit mehreren Spalten können Sie in der WHERE-Klausel Text- und Nicht-Textbedingungen kombinieren. Die Abfrageoptimierung versucht, Prädikate ohne Text mit einem Suchindex zu optimieren. Ist das nicht möglich, prüft Spanner die Bedingung für jede Zeile, die mit dem Suchindex übereinstimmt. Auf Spalten, die nicht im Suchindex gespeichert sind, wird aus der Basistabelle zugegriffen.
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 Spanner PostgreSQL-Unterstützung hat folgende 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 ist:
RatingundGenressind im Suchindex enthalten. Spanner beschleunigt Bedingungen mithilfe von Suchindex-Postinglisten.ARRAY_INCLUDES_ANYundARRAY_INCLUDES_ALLsind Google SQL-Funktionen und werden für den PostgreSQL-Dialekt nicht unterstützt.SELECT Album FROM Albums WHERE Rating > 4 AND ARRAY_INCLUDES_ANY(Genres, ['jazz'])In der Abfrage können Konjunktionen, Disjunktionen und Negationen beliebig kombiniert werden, 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 werden das Volltextprädikat fürTitleund das Nicht-Textprädikat fürRatingbeschleunigt, das Prädikat fürLikesjedoch nicht. In Spanner werden mit der Abfrage alle Dokumente mit dem Begriff „Auto“ in derTitleabgerufen, die eine Bewertung von über 4 erhalten haben. Anschließend werden Dokumente herausgefiltert, die nicht mindestens 1.000 „Mag ich“-Bewertungen haben. Diese Abfrage beansprucht viele Ressourcen, wenn fast alle Alben den Begriff „Auto“ im Titel haben und fast alle eine Bewertung von 5 Sternen haben, aber nur wenige Alben 1.000 Mag ich-Bewertungen haben. In solchen Fällen können Sie Ressourcen sparen, indem SieLikesähnlich wieRatingindexieren.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 >= 1000Coverist nicht im Index gespeichert. Bei der folgenden Abfrage wird ein Back-Join zwischenAlbumsIndexundAlbumsausgeführt, 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 Abfragen für die Volltextsuche
 - Weitere Informationen zum Ranking von Suchergebnissen
 - Weitere Informationen zur Teilstringsuche
 - Weitere Informationen zur Paginierung von Suchergebnissen
 - Weitere Informationen zur Suche in mehreren Spalten