Suchindexe können mehrere tokenisierte Spalten indexieren, wodurch Abfragen für diese Spalten effizienter werden. Auf dieser Seite wird beschrieben, wie Sie eine Suche in mehreren Spalten durchführen. Dies ist eine Art der Volltextsuche.
Suche in mehreren Spalten durchführen
Die Struktur des Such index sorgt dafür, dass für Abfragen keine verteilte Verknüpfung erforderlich ist, wodurch eine vorhersehbare Leistung der Abfragen gewährleistet wird. Die verteilte Verknüpfung wird vermieden, da sich alle Token, die einer Zeile der Basistabelle entsprechen, auf demselben Split befinden.
Betrachten Sie beispielsweise das folgende Schema:
GoogleSQL
CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
Title STRING(MAX),
Studio STRING(MAX),
Title_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Title)) HIDDEN,
Studio_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Studio)) HIDDEN
) PRIMARY KEY(AlbumId);
CREATE SEARCH INDEX AlbumsIndex ON Albums(Title_Tokens, Studio_Tokens);
PostgreSQL
CREATE TABLE albums (
albumid character varying NOT NULL,
title character varying,
studio character varying,
title_tokens spanner.tokenlist
GENERATED ALWAYS AS (TOKENIZE_FULLTEXT(title)) VIRTUAL HIDDEN,
studio_tokens spanner.tokenlist
GENERATED ALWAYS AS (TOKENIZE_FULLTEXT(studio)) VIRTUAL HIDDEN,
) PRIMARY KEY(albumid);
CREATE SEARCH INDEX albumsindex ON albums(title_tokens, studio_tokens);
Eine Abfrage kann jetzt in zwei Feldern suchen: Title_Tokens und Studio_Tokens.
GoogleSQL
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, "fifth symphony")
AND SEARCH(Studio_Tokens, "Blue Note Studio")
PostgreSQL
SELECT albumid
FROM albums
WHERE spanner.search(title_tokens, 'fifth symphony')
AND spanner.search(studio_tokens, 'Blue Note Studio')
Spanner unterstützt Suchabfragen mit mehreren Spalten in Verbindung mit den Operatoren für Konjunktion, Disjunktion und Negation in der WHERE-Klausel. Sie können alle folgenden Arten von Abfragen mit einem Suchindex verwenden:
Konjunktion: Dokumente suchen, in denen
Titleden Begriff „car“ undStudioden Begriff „sun“ enthält.GoogleSQL
SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, 'car') AND SEARCH(Studio_Tokens, 'sun')PostgreSQL
SELECT albumid FROM albums WHERE spanner.search(title_tokens, 'car') AND spanner.search(studio_tokens, 'sun')Disjunktion: Dokumente suchen, in denen entweder
Titleden Begriff „car“ oderStudioden Begriff „sun“ enthält.GoogleSQL
SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun')PostgreSQL
SELECT albumid FROM albums WHERE spanner.search(title_tokens, 'car') OR spanner.search(studio_tokens, 'sun')Negation: Alle Dokumente suchen, in denen
Titleden Begriff „car“ nicht enthält.GoogleSQL
SELECT AlbumId FROM Albums WHERE NOT SEARCH(Title_Tokens, 'car')PostgreSQL
SELECT albumid FROM albums WHERE NOT spanner.search(title_tokens, 'car')Mit der rquery-Sprache können dieselben Arten von Suchanfragen ausgeführt werden:
GoogleSQL
SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, '-car')PostgreSQL
SELECT albumid FROM albums WHERE spanner.search(title_tokens, '-car')Beide Formen filtern Dokumente, in denen
TitleNULL ist. Tokenisierungs- und Suchfunktionen sind so definiert, dass sie bei NULL-Eingabe NULL zurückgeben. In SQL wird NOT NULL als NULL definiert.
Außerdem können Sie mehrmals auf dieselbe TOKENLIST-Spalte verweisen.
GoogleSQL
SELECT AlbumId
FROM Albums
WHERE (SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun'))
AND (SEARCH(Title_Tokens, 'guy') OR SEARCH(Studio_Tokens, electric))
PostgreSQL
SELECT albumid
FROM albums
WHERE (spanner.search(title_tokens, 'car') OR spanner.search(studio_tokens, 'sun'))
AND (spanner.search(title_tokens, 'guy') OR spanner.search(studio_tokens, 'electric'))
Verwenden Sie entweder die rquery-Sprache oder SQL, um in derselben Spalte nach mehreren Begriffen zu suchen. rquery wird empfohlen aufgrund des effizienten Abfrage-Caching für parametrisierte Abfragen. Abgesehen von der besseren Cache-Trefferquote für Abfragen haben die rquery- und SQL-Sprachen dieselbe Latenz und Leistung.
GoogleSQL
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, 'car OR guy')
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, 'car') OR SEARCH(Title_Tokens, 'guy')
PostgreSQL
SELECT albumid
FROM albums
WHERE spanner.search(title_tokens, 'car OR guy')
SELECT albumid
FROM albums
WHERE spanner.search(title_tokens, 'car') OR spanner.search(title_tokens, 'guy')
Sie können auch Nicht-Text-Bedingungen, die mit Suchindexen beschleunigt werden, in derselben Abfrage mit Volltextsuchfunktionen verwenden.
Nächste Schritte
- Weitere Informationen zu Volltextsuchanfragen
- Informationen zum Ranking von Suchergebnissen
- Informationen zum Ausführen einer Teilstringsuche.
- Informationen zum Paginieren von Suchergebnissen
- Volltext- und Nicht-Text-Suchanfragen kombinieren