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, eine Art Volltextsuche.
Mehrspaltensuche ausführen
Die Struktur des Suchindexes sorgt dafür, dass für Abfragen kein verteilter Join erforderlich ist, was eine vorhersehbare Leistung der Abfragen ermöglicht. Da alle Tokens, die einer Zeile der Basistabelle entsprechen, in derselben Spalte liegen, wird der verteilte Join vermieden.
Betrachten Sie beispielsweise das folgende Schema:
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);
In einer Abfrage können jetzt beide Felder durchsucht werden:
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, "fifth symphony")
AND SEARCH(Studio_Tokens, "Blue Note Studio")
Spanner unterstützt Suchanfragen mit mehreren Spalten in Konjunktion, Disjunktion und Negation in der WHERE
-Klausel. Sie können alle folgenden Abfragetypen mit einem Suchindex verwenden:
Verbindung: Hiermit werden Dokumente gefunden, in denen
Title
den Begriff „Auto“ undStudio
den Begriff „Sonne“ enthält.SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, 'car') AND SEARCH(Studio_Tokens, 'sun')
Disjunktion: Hiermit werden Dokumente gefunden, in denen entweder
Title
den Begriff „Auto“ oderStudio
den Begriff „Sonne“ enthält.SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun')
Negation: Alle Dokumente suchen, in denen
Title
den Begriff „Auto“ nicht enthält.SELECT AlbumId FROM Albums WHERE NOT SEARCH(Title_Tokens, 'car')
Mit der rquery-Sprache können Sie dieselben Suchanfragen ausführen:
SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, '-car')
Mit beiden Formularen werden Dokumente gefiltert, bei denen
Title
NULL 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 auf dieselbe TOKENLIST
-Spalte mehrmals verweisen.
SELECT AlbumId
FROM Albums
WHERE (SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun'))
AND (SEARCH(Title_Tokens, 'guy') OR SEARCH(Studio_Tokens, electric))
Verwenden Sie entweder die RQuery-Sprache oder SQL, um nach mehreren Begriffen in derselben Spalte zu suchen. RQuery wird aufgrund des effizienten Cachings für parametrisierte Abfragen empfohlen. Abgesehen von der besseren Cache-Trefferquote für Abfragen haben die R-Query- und SQL-Sprachen dieselben Latenz- und Leistungsraten.
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')
Sie können auch Bedingungen für Nicht-Textwerte verwenden, die mit Suchindizes beschleunigt werden, in derselben Abfrage mit Volltextsuchfunktionen.
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 zum Kombinieren von Volltext- und Nicht-Textabfragen