Indeks penelusuran dapat mengindeks beberapa kolom yang ditokenisasi, sehingga kueri pada kolom ini menjadi lebih efisien. Halaman ini menjelaskan cara melakukan penelusuran di beberapa kolom, yang merupakan jenis penelusuran teks lengkap.
Melakukan penelusuran multi-kolom
Struktur indeks penelusuran memastikan kueri tidak memerlukan join terdistribusi, sehingga memastikan performa kueri yang dapat diprediksi. Join terdistribusi dihindari karena kolokasi semua token yang sesuai dengan baris tabel dasar pada bagian 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 dengan
Title
yang memiliki istilah "mobil" danStudio
yang memiliki istilah "matahari".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: Menemukan dokumen yang
Title
-nya berisi istilah "mobil" atauStudio
-nya berisi istilah "matahari"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
-nya tidak berisi istilah "mobil".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 formulir memfilter dokumen dengan
Title
adalah 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 dalam kolom yang sama. rquery direkomendasikan karena cache kueri yang efisien untuk kueri berparameter. Selain rasio hit cache kueri yang lebih baik, bahasa kueri dan SQL memiliki rasio latensi dan 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
- Pelajari kueri penelusuran teks lengkap.
- Pelajari cara mengurutkan hasil penelusuran.
- Pelajari cara melakukan penelusuran substring.
- Pelajari cara memberi nomor halaman pada hasil penelusuran.
- Pelajari cara menggabungkan kueri teks lengkap dan non-teks.