Perluasan kueri penelusuran

Halaman ini menjelaskan cara menggunakan peningkatan kueri sebagai bagian dari penelusuran teks lengkap .

Untuk meningkatkan kemungkinan menemukan hasil yang relevan, Spanner menawarkan kemampuan lanjutan yang memperluas kueri penelusuran untuk menyertakan istilah terkait, sinonim, dan koreksi ejaan. Spanner menyediakan opsi berikut untuk peningkatan kueri:

Kueri yang ditingkatkan

Untuk menggunakan kueri yang ditingkatkan, tetapkan enhance_query=>true dalam fungsi SEARCH. Spanner kemudian otomatis memperluas kueri penelusuran dengan menyertakan istilah dan sinonim terkait, menerapkan stemming, dan melakukan koreksi ejaan. Misalnya, saat menggunakan kueri yang ditingkatkan, kueri penelusuran hotl cal cocok dengan album Hotel California.

GoogleSQL

SELECT AlbumId
FROM Albums
WHERE SEARCH(AlbumTitle_Tokens, 'hotl cal', enhance_query=>true)

PostgreSQL

SELECT albumid
FROM albums
WHERE spanner.search(albumtitle_tokens, 'hotl cal', enhance_query=>true)

enhance_query adalah opsi waktu kueri yang tidak memengaruhi tokenisasi. Anda dapat menggunakan indeks penelusuran yang sama dengan atau tanpa enhance_query.

Google terus meningkatkan algoritma peningkatan kueri. Oleh karena itu, kueri dengan enhance_query => true mungkin menghasilkan hasil yang sedikit berbeda dari waktu ke waktu.

Saat enhance_query digunakan, latensi mungkin meningkat karena overhead perluasan kueri penelusuran dan eksekusi kueri yang lebih besar.

Kamus kustom

Anda dapat menggunakan kamus kustom dengan penelusuran teks lengkap Spanner untuk menentukan sinonim untuk istilah dalam set data Anda. Hal ini berguna untuk menangkap sinonim, akronim, istilah yang setara, dan variasi kata lainnya untuk meningkatkan pengambilan hasil penelusuran.

Membuat tabel kamus kustom

Kamus kustom adalah tabel yang dibuat pengguna yang berisi key-value pair istilah dan sinonimnya. Untuk membuatnya, sertakan opsi fulltext_dictionary_table = true dalam pernyataan CREATE TABLE. Tabel harus memiliki dua kolom:

  • Key: Kolom string yang tidak dapat diisi null untuk istilah yang akan diperluas dengan sinonim.
  • Value: Kolom array string yang tidak dapat diisi null untuk array sinonim untuk kunci.

Tidak boleh ada kolom selain Key dan Value dalam tabel. Jika istilah penelusuran cocok dengan Key dalam kamus, penelusuran akan diperluas untuk menyertakan semua sinonim yang sesuai di Value bersama dengan istilah kunci itu sendiri. Contoh berikut membuat tabel kamus kustom bernama MyCustomDictionary. Anda juga harus menetapkan opsi tabel fulltext_dictionary_table=true pada tabel ini selama pembuatan.

GoogleSQL

CREATE TABLE MyCustomDictionary (
  Key STRING(MAX) NOT NULL,
  Value ARRAY<STRING(MAX)> NOT NULL,
) PRIMARY KEY(Key),
OPTIONS (fulltext_dictionary_table = true);

PostgreSQL

CREATE TABLE mycustomdictionary (
  key character varying  NOT NULL,
  value character varying [] NOT NULL,
  PRIMARY KEY(key)
)  WITH ( type = 'fulltext_dictionary')

Setelah membuat tabel, sisipkan sinonim Anda:

GoogleSQL

INSERT INTO MyCustomDictionary (Key, Value) VALUES
('album', ['vinyl', 'cassette']),
('edm', ['electronic dance music']);

PostgreSQL

INSERT INTO mycustomdictionary (key, value) VALUES
('album', ARRAY['vinyl', 'cassette']),
('edm', ARRAY['electronic dance music']);

Saat mengisi tabel, perhatikan hal berikut:

  • Kunci harus berupa satu kata.
  • Nilai dapat berupa satu kata atau frasa multi-kata. Jika nilai berisi beberapa kata, nilai tersebut akan diperlakukan sebagai penelusuran frasa selama perluasan kueri.
  • Semua kunci dan nilai harus dalam huruf kecil. Hal ini memastikan kunci dan nilai cocok dengan token penelusuran, yang dikonversi menjadi huruf kecil oleh tokenizer default.

Perluasan penelusuran hanya terjadi jika istilah penelusuran cocok dengan Key. Jika istilah penelusuran cocok dengan sinonim di Value, tetapi tidak cocok dengan Key, penelusuran tidak akan diperluas. Jika Anda memerlukan pemetaan dua arah (misalnya, agar penelusuran untuk vinyl atau cassette juga menemukan album), Anda juga harus menyisipkan pemetaan terbalik ke dalam tabel kamus. Contoh berikut menunjukkan cara menyisipkan pemetaan dua arah untuk album, vinyl, dan cassette:

GoogleSQL

INSERT INTO MyCustomDictionary (Key, Value)
-- 1. Insert album -> vinyl, cassette
SELECT 'album', ['vinyl', 'cassette']
UNION ALL
-- 2. Insert vinyl -> album and cassette -> album
SELECT syn, ['album']
FROM UNNEST(['vinyl', 'cassette']) AS syn;

PostgreSQL

INSERT INTO mycustomdictionary (key, value)
-- 1. Insert album -> vinyl, cassette
SELECT 'album', ARRAY['vinyl', 'cassette']
UNION ALL
-- 2. Insert vinyl -> album and cassette -> album
SELECT syn, ARRAY['album']
FROM unnest(ARRAY['vinyl', 'cassette']) AS syn;

Menggunakan kamus kustom dalam kueri penelusuran

Untuk menggunakan kamus kustom, tentukan nama tabel kamus dalam argumen dictionary dari fungsi SEARCH.

  • Jika istilah penelusuran adalah kunci dalam kamus, SEARCH juga akan mencari nilainya. Istilah album cocok dengan pesan yang berisi vinyl atau cassette.

    GoogleSQL

    SELECT MessageId, Body
    FROM Messages
    WHERE SEARCH(Body_Tokens, 'album', dictionary=>'MyCustomDictionary');
    

    PostgreSQL

    SELECT messageid, body
    FROM messages
    WHERE spanner.search(body_tokens, 'album', dictionary=>'mycustomdictionary');
    
  • Jika nilai kamus berisi beberapa kata seperti electronic dance music untuk kunci edm, nilai tersebut akan diperlakukan sebagai penelusuran frasa. Artinya, istilah harus muncul berdekatan dan dalam urutan yang sama persis agar dianggap cocok. Misalnya, kueri berikut menampilkan hasil yang berisi frasa persis "electronic dance music", tetapi tidak cocok dengan "dance electronic music". Hal ini terutama berguna untuk memperluas akronim dan dapat digunakan dengan cara berikut:

    GoogleSQL

    SELECT MessageId, Body
    FROM Messages
    WHERE SEARCH(Body_Tokens, 'edm', dictionary=>'MyCustomDictionary');
    

    PostgreSQL

    SELECT messageid, body
    FROM messages
    WHERE spanner.search(body_tokens, 'edm', dictionary=>'mycustomdictionary');
    

Keterlambatan pencarian kamus

Secara default, entri kamus kustom dibaca dengan keterlambatan maksimum 15 detik. Hal ini mengurangi overhead operasi baca karena membaca data dengan keterlambatan tertentu lebih efisien daripada membaca data terbaru. Oleh karena itu, perubahan pada entri kamus mungkin memerlukan waktu hingga 15 detik untuk ditampilkan dalam kueri penelusuran. Anda dapat mengganti perilaku ini dengan cara berikut:

  • Menggunakan opsi tabel fulltext_dictionary_staleness.
  • Menggunakan petunjuk kueri fulltext_dictionary_staleness untuk kontrol yang lebih terperinci.

Petunjuk kueri akan mengganti opsi tabel jika keduanya digunakan.

Opsi tabel fulltext_dictionary_staleness

Anda dapat menetapkan opsi fulltext_dictionary_staleness untuk tabel kamus. Semua kueri yang menggunakan tabel kamus ini akan menggunakan nilai keterlambatan ini, kecuali jika diganti oleh petunjuk kueri.

GoogleSQL

Contoh berikut menunjukkan cara CREATE tabel dengan opsi fulltext_dictionary_staleness:

CREATE TABLE MyCustomDictionary (
  Key STRING(MAX) NOT NULL,
  Value ARRAY<STRING(MAX)> NOT NULL,
) PRIMARY KEY(Key),
OPTIONS (
  fulltext_dictionary_table = true,
  fulltext_dictionary_staleness = '5s'
);

Contoh berikut menunjukkan cara ALTER tabel untuk mengubah atau menetapkan opsi fulltext_dictionary_staleness:

ALTER TABLE MyCustomDictionary SET OPTIONS (
  fulltext_dictionary_staleness = '60s'
);

PostgreSQL

Contoh berikut menunjukkan cara CREATE tabel dengan opsi fulltext_dictionary_staleness:

-- Create with 5s staleness
CREATE TABLE mycustomdictionary (
  key character varying NOT NULL,
  value character varying[]  NOT NULL,
  PRIMARY KEY(key)
) WITH (
  type = 'fulltext_dictionary',
  fulltext_dictionary_staleness = '5s'
);

Antarmuka PostgreSQL tidak mendukung tabel ALTER untuk mengubah atau menetapkan opsi fulltext_dictionary_staleness.

Petunjuk kueri fulltext_dictionary_staleness

Untuk kontrol yang lebih terperinci, Anda dapat menggunakan petunjuk kueri fulltext_dictionary_staleness untuk menentukan keterlambatan yang berbeda untuk setiap kueri. Petunjuk ini mengganti setelan tingkat tabel.

Contoh berikut menggunakan petunjuk untuk melakukan pencarian tabel kamus dengan keterlambatan nol. Hal ini memastikan entri kamus terbaru dibaca. Pendekatan ini dapat meningkatkan latensi kueri karena membaca data terbaru kurang efisien dibandingkan mengizinkan keterlambatan tertentu.

GoogleSQL

@{fulltext_dictionary_staleness="0s"}
SELECT MessageId, Body
FROM Messages
WHERE SEARCH(Body_Tokens, 'Bill', dictionary=>'MyCustomDictionary');

PostgreSQL

/*@ fulltext_dictionary_staleness='0s' */
SELECT messageid, body
FROM messages
WHERE spanner.search(body_tokens, 'Bill', dictionary=>'mycustomdictionary');

Batasan umum dengan tabel kamus kustom

  • Ada dukungan terbatas untuk menggunakan Impor dan Ekspor Spanner dengan tabel kamus kustom.
  • Tabel kamus kustom harus dibuat dalam skema default, dan tidak dapat dibuat dalam skema bernama.
  • Tabel kamus kustom hanya mendukung dialek kueri SEARCH default.

Menggabungkan kamus kustom dengan kueri yang ditingkatkan

Anda dapat menggabungkan sinonim kamus kustom dengan enhanced query dengan menetapkan dictionary dan enhance_query=>true dalam fungsi SEARCH. Peningkatan kueri dapat memperluas kueri dengan sinonim umum atau koreksi ejaan, sedangkan kamus kustom memungkinkan Anda menentukan perluasan sendiri. Misalnya, jika enhance_query memperluas album untuk menyertakan record, dan MyCustomDictionary memetakan album ke ['vinyl', 'cassette'], kueri berikut akan cocok dengan pesan yang berisi album, record, vinyl, atau cassette:

GoogleSQL

SELECT MessageId, Body
FROM Messages
WHERE SEARCH(Body_Tokens, 'album', enhance_query=>true, dictionary=>'MyCustomDictionary');

PostgreSQL

SELECT messageid, body
FROM messages
WHERE spanner.search(body_tokens, 'album', enhance_query=>true, dictionary=>'mycustomdictionary');

Jika kedua peningkatan diaktifkan, keduanya akan beroperasi secara independen pada istilah penelusuran asli, dan istilah yang dihasilkan oleh satu peningkatan tidak digunakan sebagai input untuk peningkatan lainnya.

Langkah berikutnya