Menelusuri beberapa kolom dalam indeks penelusuran

Indeks penelusuran dapat mengindeks beberapa kolom yang diberi token, sehingga kueri pada kolom ini menjadi lebih efisien. Halaman ini menjelaskan cara melakukan penelusuran di beberapa kolom, yang merupakan jenis penelusuran teks lengkap.

Struktur indeks penelusuran memastikan bahwa kueri tidak memerlukan gabungan terdistribusi, sehingga memastikan performa kueri yang dapat diprediksi. Gabungan terdistribusi dihindari karena kolokasi semua token yang sesuai dengan baris tabel dasar pada split yang sama.

Misalnya, perhatikan skema berikut:

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);

Kueri kini dapat menelusuri dua kolom: Title_Tokens dan 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 mendukung kueri penelusuran multi-kolom dalam operator konjungsi, disjungsi, dan negasi dalam klausa WHERE. Anda dapat menggunakan semua jenis kueri berikut dengan indeks penelusuran:

  • Konjungsi: Temukan dokumen yang Title memiliki istilah "car" dan Studio memiliki istilah "sun".

    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')
    
  • Disjungsi: Temukan dokumen yang Title-nya memiliki istilah "car" atau Studio-nya memiliki istilah "sun"

    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')
    
  • Negasi: Temukan semua dokumen yang Title tidak berisi istilah "car".

    GoogleSQL

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

    PostgreSQL

    SELECT albumid
    FROM albums
    WHERE NOT spanner.search(title_tokens, 'car')
    

    Bahasa rquery dapat melakukan jenis penelusuran yang sama:

    GoogleSQL

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

    PostgreSQL

    SELECT albumid
    FROM albums
    WHERE spanner.search(title_tokens, '-car')
    

    Kedua bentuk tersebut memfilter dokumen yang Title-nya NULL. Fungsi tokenisasi dan penelusuran ditentukan untuk menampilkan NULL pada input NULL. SQL menentukan NOT NULL sebagai NULL.

Selain itu, Anda dapat mereferensikan kolom TOKENLIST yang sama beberapa kali.

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'))

Gunakan bahasa rquery atau SQL untuk menelusuri beberapa istilah di kolom yang sama. rquery direkomendasikan karena caching kueri yang efisien untuk kueri berparameter. Selain rasio hit cache kueri yang lebih baik, bahasa rquery dan SQL memiliki latensi dan rasio performa yang sama.

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')

Anda juga dapat menggunakan kondisi non-teks yang dipercepat dengan indeks penelusuran dalam kueri yang sama dengan fungsi penelusuran teks lengkap.

Langkah berikutnya