Menggabungkan TOKENLIST

Halaman ini menjelaskan cara menyambungkan TOKENLIST di indeks penelusuran saat Anda menyiapkan skema atau dalam kueri penelusuran saat melakukan penelusuran teks lengkap di Spanner.

Menggabungkan TOKENLIST dalam indeks penelusuran

Terkadang, Anda memerlukan aplikasi untuk menelusuri setiap kolom. Terkadang, aplikasi perlu menelusuri semua kolom. Misalnya, dalam tabel dengan dua kolom string, Anda mungkin ingin aplikasi menelusuri kedua kolom tanpa membedakan kolom mana yang berisi pencocokan.

Di Spanner, ada dua cara untuk melakukannya:

  1. Buat token kata secara terpisah dan gabungkan nilai TOKENLIST yang dihasilkan (direkomendasikan).
  2. Gabungkan string dan tokenkan hasilnya.

Dengan pendekatan kedua, ada dua masalah:

  1. Jika Anda ingin mengindeks Title atau Studio satu per satu, selain mengindeksnya dalam TOKENLIST gabungan, teks yang sama akan ditokenisasi dua kali. Hal ini menyebabkan transaksi menggunakan lebih banyak resource.
  2. Penelusuran frasa mencakup kedua kolom. Misalnya, jika @p ditetapkan ke "Blue Note", nilai ini akan cocok dengan baris yang berisi Title="Big Blue Note" dan Studio="Blue Note Studios".

Pendekatan pertama menyelesaikan masalah ini karena frasa hanya cocok dengan satu kolom dan setiap kolom string hanya ditokenisasi satu kali jika TOKENLIST individual dan gabungan diindeks. Meskipun setiap kolom string hanya ditokenisasi satu kali, TOKENLIST yang dihasilkan disimpan secara terpisah dalam indeks.

Membuat token kata secara terpisah dan menggabungkan nilai TOKENLIST

Contoh berikut membuat token setiap kata dan menggabungkan nilai TOKENLIST:

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,
  Combined_Tokens TOKENLIST AS (TOKENLIST_CONCAT([Title_Tokens, Studio_Tokens])) HIDDEN,
) PRIMARY KEY(AlbumId);

CREATE SEARCH INDEX AlbumsIndex ON Albums(Combined_Tokens);

SELECT AlbumId FROM Albums WHERE SEARCH(Combined_Tokens, @p);

Penggabungan TOKENLIST juga dapat diterapkan sepenuhnya di sisi kueri. Untuk informasi selengkapnya, lihat Koncatenasi TOKENLIST sisi kueri.

TOKENLIST_CONCAT didukung untuk penelusuran teks lengkap dan substring. Spanner tidak mengizinkan Anda menggabungkan jenis tokenisasi, seperti TOKENIZE_FULLTEXT dan TOKENIZE_SUBSTRING dalam panggilan TOKENLIST_CONCAT yang sama.

Definisi kolom TOKENLIST teks dapat diubah di kolom yang tidak disimpan untuk menambahkan kolom tambahan. Hal ini berguna saat Anda ingin menambahkan kolom tambahan ke TOKENLIST_CONCAT. Mengubah ekspresi kolom yang dihasilkan tidak mengisi ulang baris yang ada dalam indeks.

Menggabungkan string dan membuat token hasil

Contoh berikut menyambungkan string dan membuat token hasil:

CREATE TABLE Albums (
  AlbumId STRING(MAX) NOT NULL,
  Title STRING(MAX),
  Studio STRING(MAX),
  Combined_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Title || " " || Studio)) HIDDEN,
) PRIMARY KEY(AlbumId);

CREATE SEARCH INDEX AlbumsIndex ON Albums(Combined_Tokens);

SELECT AlbumId FROM Albums WHERE SEARCH(Combined_Tokens, @p);

Penggabungan TOKENLIST sisi kueri

Kompromi dengan pengindeksan TOKENLIST yang digabungkan adalah peningkatan biaya penyimpanan dan operasi tulis. Setiap token kini disimpan di disk dua kali: sekali dalam daftar postingan TOKENLIST aslinya, dan sekali dalam daftar postingan TOKENLIST gabungan. Penggabungan sisi kueri kolom TOKENLIST menghindari biaya ini, tetapi kueri menggunakan lebih banyak resource komputasi.

Untuk menyambungkan beberapa TOKENLIST, gunakan fungsi TOKENLIST_CONCAT dalam kueri SEARCH. Untuk bagian ini, kita menggunakan contoh skema berikut:

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

Kueri berikut menelusuri baris yang memiliki token "blue" dan "note" di mana saja di kolom Title dan Studio. Hal ini mencakup baris dengan "biru" dan "catatan" di kolom Title, "biru" dan "catatan" di kolom Studio, dan "biru" di kolom Title dan "catatan" di kolom Studio, atau sebaliknya.

SELECT AlbumId
FROM Albums
WHERE SEARCH(TOKENLIST_CONCAT([AlbumTitle_Tokens, Studio_Tokens]), 'blue note')

Penggabungan TOKENLIST sisi tulis dan sisi kueri menghasilkan hasil yang identik. Pilihan antara keduanya adalah kompromi antara biaya disk dan biaya kueri.

Atau, aplikasi dapat menelusuri beberapa kolom TOKENLIST dan menggunakan OR bersama dengan fungsi SEARCH:

SEARCH(AlbumTitle_Tokens, 'Blue Note') OR SEARCH(Studio_Tokens, 'Blue Note')

Namun, hal ini memiliki semantik yang berbeda. Tidak cocok dengan album yang AlbumTitle_Tokens-nya memiliki "blue", tetapi tidak memiliki "note" dan Studio_Tokens-nya memiliki "note", tetapi tidak memiliki "blue".

Langkah selanjutnya