Melakukan penelusuran substring

Selain pencocokan token lengkap, indeks penelusuran Spanner mendukung penelusuran substring. Halaman ini menjelaskan cara melakukan penelusuran substring sebagai bagian dari penelusuran teks lengkap di Spanner.

Penelusuran substring memiliki karakteristik berikut:

  • Tidak peka huruf besar/kecil, menghapus sebagian besar tanda baca, dan menormalisasi spasi.
  • Tidak ada segmentasi bahasa China, Jepang, Korea (CJK), karena kueri CJK parsial sering kali disegmentasikan dengan tidak benar.
  • Untuk beberapa istilah penelusuran, hasilnya harus berisi substring dari setiap istilah. Misalnya, 'happ momen' cocok dengan "happy moment", karena kedua substring ditemukan dalam teks. Tidak cocok dengan "happy day".

Contoh

Teks tersimpan Kueri substring Match
Bridge over Troubled Water ridg roub Ya
Bridge over Troubled Water ridg , roub Ya
Bridge over Troubled Water over brid Ya
Bridge over Troubled Water jembatan ate Ya
Bridge over Troubled Water Jembatan jembatan jembatan Ya
Bridge over Troubled Water bri trou ter Ya
Bridge over Troubled Water bri dge Ya
Bridge over Troubled Water troubledwater Tidak
Bridge over Troubled Water trubled Tidak

Untuk penelusuran substring, gunakan fungsi TOKENIZE_SUBSTRING dalam definisi kolom TOKENLIST, seperti yang ditunjukkan dalam contoh DDL berikut:

GoogleSQL

CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
AlbumTitle STRING(MAX),
AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_SUBSTRING(AlbumTitle)) HIDDEN
) PRIMARY KEY(AlbumId);

CREATE SEARCH INDEX AlbumsTitleIndex ON Albums(AlbumTitle_Tokens);

PostgreSQL

Contoh ini menggunakan spanner.tokenize_substring.

CREATE TABLE albums (
albumid character varying NOT NULL,
albumtitle character varying,
albumtitle_tokens spanner.tokenlist
    GENERATED ALWAYS AS (spanner.tokenize_substring(albumtitle)) VIRTUAL HIDDEN,
PRIMARY KEY(albumid));

CREATE SEARCH INDEX albumstitleindex ON albums(albumtitle_tokens);

Dalam kueri SQL, gunakan fungsi SEARCH_SUBSTRING dalam klausa WHERE. Misalnya, kueri berikut cocok dengan album berjudul "happy" dari tabel yang dibuat dalam contoh sebelumnya:

GoogleSQL

SELECT AlbumId
FROM Albums
WHERE SEARCH_SUBSTRING(AlbumTitle_Tokens, 'happ');

PostgreSQL

Contoh ini menggunakan spanner.search_substring.

SELECT albumid
FROM albums
WHERE spanner.search_substring(albumtitle_tokens, 'happ');

TOKENIZE_SUBSTRING menghasilkan n-gram untuk setiap token dan menyimpan n-gram ini dalam indeks penelusuran. Panjang n-gram minimum dan maksimum yang akan dibuat dikonfigurasi melalui argumen opsional.

Indeks penelusuran substring dapat menggunakan penyimpanan 10-30x lebih banyak daripada indeks teks lengkap untuk data yang sama, karena tokenisasi menghasilkan lebih banyak token. Hal ini terutama berlaku jika perbedaan antara ngram_size_min dan ngram_size_max semakin besar. Kueri substring juga menggunakan lebih banyak resource untuk dieksekusi.

Seperti TOKENIZE_FULLTEXT, Anda dapat mengonfigurasi TOKENIZE_SUBSTRING untuk menggunakan jenis konten tertentu.

Selain penelusuran substring dasar, SEARCH_SUBSTRING mendukung mode penelusuran relatif. Penelusuran relatif mempertajam hasil penelusuran substring.

Untuk mengaktifkan mode penelusuran relatif, tetapkan parameter relative_search_types dari TOKENIZE_SUBSTRING ke array yang tidak kosong dengan elemen jenis penelusuran relatif yang didukung.

Jika penelusuran relatif diaktifkan dalam tokenisasi, SEARCH_SUBSTRING dapat melakukan kueri dengan jenis penelusuran relatif berikut:

  • phrase: mencocokkan substring yang berdekatan

    Contoh

    Teks tersimpan Kueri substring. Match
    Bridge over Troubled Water jembatan di atas Ya
    Bridge over Troubled Water Jembatan jembatan jembatan Tidak
    Bridge over Troubled Water brid over Tidak
    Bridge over Troubled Water mengatasi masalah Ya
    Bridge over Troubled Water jembatan di atas perairan yang bergejolak Tidak
    Bridge over Troubled Water idge ove Ya
    Bridge over Troubled Water idge , ove Ya
    Bridge over Troubled Water RIDGE OVE Ya
    Bridge over Troubled Water air jembatan Tidak
  • value_prefix: mencocokkan substring yang berdekatan dan kecocokan harus dimulai di awal nilai. Secara konseptual, hal ini mirip dengan fungsi STARTS_WITH untuk string yang dinormalisasi menurut huruf besar/kecil dan spasi.

    Contoh

    Teks tersimpan Kueri substring Match
    Bridge over Troubled Water jembatan di atas Ya
    Bridge over Troubled Water jembatan , di atas Ya
    Bridge over Troubled Water melintasi punggungan Tidak
    Bridge over Troubled Water air yang bergejolak Tidak
  • value_suffix: mencocokkan substring yang berdekatan dan kecocokan harus cocok di akhir nilai. Secara konseptual, hal ini mirip dengan fungsi ENDS_WITH untuk string yang dinormalisasi menurut huruf besar/kecil dan spasi.

    Contoh

    Teks tersimpan Kueri substring. Match
    Bridge over Troubled Water air yang bergejolak Ya
    Bridge over Troubled Water air ; bermasalah Ya
    Bridge over Troubled Water air keruh Ya
    Bridge over Troubled Water air bermasalah Tidak
    Bridge over Troubled Water air bermasalah Tidak
    Bridge over Troubled Water jembatan di atas Tidak
  • word_prefix: seperti value_prefix, tetapi string harus cocok di batas istilah (bukan batas nilai).

    Contoh

    Teks tersimpan Kueri substring Match
    Bridge over Troubled Water mengatasi masalah Ya
    Bridge over Troubled Water Over , trouble Ya
    Bridge over Troubled Water air keruh Tidak
    Bridge over Troubled Water di atas air Tidak
    Bridge over Troubled Water ove bermasalah Tidak
    Bridge over Troubled Water ver bermasalah Ya
  • word_suffix: seperti value_suffix, tetapi string harus cocok di akhir batas istilah.

    Contoh

    Teks tersimpan Kueri substring Match
    Bridge over Troubled Water ver bermasalah Ya
    Bridge over Troubled Water mengatasi masalah Tidak
    Bridge over Troubled Water di atas air Tidak
    Bridge over Troubled Water ove bermasalah Tidak

Langkah berikutnya