In Suchindexen in mehreren Spalten suchen

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.

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:

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 gesucht werden: 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 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“ und Studio den Begriff „Sonne“ 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: Hiermit werden Dokumente gefunden, in denen entweder Title den Begriff „Auto“ oder Studio den Begriff „Sonne“ 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 Title den Begriff „Auto“ 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 Sie dieselben Arten von Suchanfragen ausführen:

    GoogleSQL

    SELECT AlbumId
    FROM Albums
    WHERE SEARCH(Title_Tokens, '-car')
    

    PostgreSQL

    SELECT albumid
    FROM albums
    WHERE spanner.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.

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 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.

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 Bedingungen für Nicht-Textwerte verwenden, die mit Suchindexen beschleunigt werden, in derselben Abfrage mit Volltextsuchfunktionen.

Nächste Schritte