lakebase_tokenizer

Ekstensi ini lakebase_tokenizer menambahkan tokenisasi seluruh kata yang dapat dikonfigurasi ke pencarian teks penuh PostgreSQL di Lakebase. Konfigurasi pencarian teks yang dibangun dengan ekstensi bekerja dengan to_tsvector, @@ operator, fungsi peringkat, dan indeks GIN. Anda juga dapat menggunakan nilai yang dihasilkan tsvector untuk lakebase_text peringkat BM25.

Ekstensi ini menyediakan tokenizer_wholeword template melalui antarmuka kamus pencarian teks standar PostgreSQL. Template ini mendukung konversi huruf kecil, normalisasi Unicode, penghapusan aksen, penghapusan posesif bahasa Inggris, kata henti khusus, sinonim satu-ke-satu, dan pengakhiran aksen bahasa Inggris.

Install

Instal ekstensi tersebut di database Anda. Contoh di halaman ini menggunakan skema khusus untuk memudahkan identifikasi objek ekstensi:

CREATE SCHEMA IF NOT EXISTS tokenizer_ext;
CREATE EXTENSION IF NOT EXISTS lakebase_tokenizer WITH SCHEMA tokenizer_ext;

Perpanjangan ini dapat dipindahkan. Anda bisa menggantinya tokenizer_ext dengan skema lain saat menginstalnya.

Tingkatkan ekstensi

Rilis baru Lakebase Search dapat menambahkan fitur, perbaikan, dan peningkatan performa. PostgreSQL tidak secara otomatis memperbarui versi ekstensi yang terpasang. Periksa versi terpasang dan versi terbaru yang tersedia:

SELECT installed_version, default_version
FROM pg_available_extensions
WHERE name = 'lakebase_tokenizer';

Perbarui ekstensi ke versi terbaru yang tersedia:

ALTER EXTENSION lakebase_tokenizer UPDATE;

ALTER EXTENSION tidak meregenerasi nilai yang tersimpan tsvector atau membangun kembali GIN atau lakebase_bm25 indeks yang bergantung. Jika pembaruan mengubah output tokenisasi, regenerasi nilai yang disimpan tsvector dan ikuti catatan rilis untuk pemeliharaan indeks yang diperlukan.

Mulai cepat dengan tokenizer_wholeword

Contoh berikut membuat kamus dari tokenizer_wholeword template, lalu memetakan tipe token PostgreSQL yang umum ke kamus tersebut dalam konfigurasi pencarian teks:

CREATE TEXT SEARCH DICTIONARY documents_dict (
  TEMPLATE          = tokenizer_ext.tokenizer_wholeword,
  Lowercase         = 'true',
  StripAccents      = 'true',
  Stemmer           = 'english'
);

CREATE TEXT SEARCH CONFIGURATION documents_cfg (COPY = pg_catalog.simple);

ALTER TEXT SEARCH CONFIGURATION documents_cfg
  ALTER MAPPING FOR asciiword, word, numword, hword_numpart, hword_part, hword_asciipart
  WITH documents_dict;

Gunakan konfigurasi untuk menghasilkan tsvector, membuat indeks GIN, dan menjalankan kueri teks penuh:

CREATE TABLE documents (
  id            BIGSERIAL PRIMARY KEY,
  body          TEXT NOT NULL,
  search_vector TSVECTOR GENERATED ALWAYS AS (
    to_tsvector('documents_cfg', body)
  ) STORED
);

INSERT INTO documents (body) VALUES
  ('Cats are running near the café.'),
  ('A dog is sleeping in the house.');

CREATE INDEX documents_search_idx ON documents USING gin (search_vector);

SELECT id, body
FROM documents
WHERE search_vector @@ plainto_tsquery('documents_cfg', 'running café');

Gunakan konfigurasi pencarian teks yang sama untuk dokumen dan kueri sehingga kedua sisi menerapkan strategi dan opsi tokenisasi yang sama.

Templat: tokenizer_wholeword

Cara kerjanya

Untuk setiap token yang diteruskan ke kamus oleh parser pencarian teks PostgreSQL, tokenizer_wholeword diterapkan operasi-operasi berikut:

  1. Lowercase: Konversi token menjadi huruf kecil.
  2. Normalize: Terapkan normalisasi Unicode.
  3. StripAccents: Hapus aksen.
  4. EnglishPossessive: Hapus akhiran posesif bahasa Inggris ketika setidaknya satu karakter tersisa.
  5. Stopwords: Tidak mengeluarkan leksime dan menghentikan pemrosesan jika token sesuai dengan kata henti yang dikonfigurasi. Token dihilangkan dari angka yang dihasilkan tsvector.
  6. Synonyms: Emisi pengganti yang dikonfigurasi dan hentikan pemrosesan jika token sesuai dengan sinonim.
  7. Stemmer: Jika tidak ada sinonim yang cocok dan stemming diaktifkan, gunakan stemmer bahasa Inggris.

Tambahkan kata henti dan sinonim

Template tokenizer_wholeword dapat memuat kata henti dan sinonim kustom dari tabel lakebase_tokenizer_stopwords SQL yang dikelola ekstensi dan lakebase_tokenizer_synonyms. Kolom mengelompokkan name baris ke dalam satu set yang Anda pilih dengan Stopwords opsi kamus atau Synonyms .

INSERT INTO tokenizer_ext.lakebase_tokenizer_stopwords (name, word) VALUES
  ('app_stopwords', 'the'),
  ('app_stopwords', 'and'),
  ('app_stopwords', 'or');

INSERT INTO tokenizer_ext.lakebase_tokenizer_synonyms (name, word, synonym) VALUES
  ('app_synonyms', 'usa', 'united_states'),
  ('app_synonyms', 'uk', 'united_kingdom');

Referensikan himpunan saat Anda membuat atau mengubah tokenizer_wholeword kamus:

ALTER TEXT SEARCH DICTIONARY documents_dict (
  Stopwords = 'app_stopwords',
  Synonyms  = 'app_synonyms'
);

Ekstensi ini membandingkan kata henti dan kata sumber sinonim dengan setiap token setelah menerapkan , , , dan EnglishPossessive, tetapi sebelum menerapkan Stemmer. StripAccentsNormalizeLowercase Entri katalog tidak diubah secara otomatis, jadi simpan dalam bentuk persis yang dihasilkan oleh opsi yang diaktifkan:

  • Dengan Lowercase = 'true', gunakan entri huruf kecil. Dengan Lowercase = 'false', kapitalisasi harus sesuai dengan token.
  • Dengan diaktifkan, simpan Normalize entri dalam formulir normalisasi Unicode yang dipilih.
  • Dengan , simpan StripAccents = 'true'bentuk yang digarisbawahi aksen. Misalnya, simpan cafe untuk mencocokkan café.
  • Simpan bentuk sebelum membuat tangkai tangkai. Misalnya, dengan Stemmer = 'english', sebuah run entri tidak cocok runningdengan . Tambahkan running ke filter atau ganti token tersebut.

Nama himpunan dapat berisi hingga 256 byte. Kata dan sinonim dapat memuat hingga 1024 byte. Setiap set kata henti atau sinonim yang bernama dapat berisi hingga 100.000 baris.

Penggantian sinonim dipancarkan persis seperti yang disimpan dan tidak diproses oleh stemmer. Sinonim mendukung satu pengganti untuk setiap kata sumber. Untuk merepresentasikan penggantian multikata sebagai satu leksium, gunakan pemisah seperti garis bawah, seperti dalam united_states.

Setelah mengubah sebuah himpunan, pemilik setiap kamus yang merujuk pada himpunan tersebut harus menjalankan no-op ALTER TEXT SEARCH DICTIONARY untuk memaksa pemuatan ulang:

ALTER TEXT SEARCH DICTIONARY documents_dict (dummy);

dummy Opsi tidak ada pada tokenizer_wholeword. Menghilangkan nilai meminta PostgreSQL untuk menghapus opsi yang tidak ada ini, yang menghilangkan cache tanpa mengubah opsi yang dikonfigurasi kamus.

Setelah memuat ulang kamus, buat ulang nilai yang tersimpan tsvector dengan menulis ulang baris sumber:

UPDATE documents SET body = body;

Peran dan akses

Gunakan dua peran untuk memisahkan akses aplikasi dari administrasi tokenizer:

  • app_role menggunakan kamus yang sudah ada. Ia perlu USAGE menggunakan skema yang relevan dan SELECT tabel katalog ekstensi, tetapi tidak perlu memiliki kamus.
  • tokenizer_admin mengelola set kata henti dan sinonim, membuat dan memiliki kamus serta konfigurasi pencarian teks, serta menjalankan perintah reload setelah mengubah set.

Berikan akses ke skema ekstensi dan tabel katalog:

GRANT USAGE ON SCHEMA tokenizer_ext TO app_role, tokenizer_admin;

GRANT SELECT ON
  tokenizer_ext.lakebase_tokenizer_stopwords,
  tokenizer_ext.lakebase_tokenizer_synonyms
TO app_role;

GRANT SELECT, INSERT, UPDATE, DELETE ON
  tokenizer_ext.lakebase_tokenizer_stopwords,
  tokenizer_ext.lakebase_tokenizer_synonyms
TO tokenizer_admin;

tokenizer_admin juga diperlukan CREATE pada skema tempat kamus dan konfigurasi pencarian teks disimpan. Buat objek-objek ini sebagai tokenizer_admin, atau alihkan kepemilikannya ke objek tersebut. Akses tulis ke tabel katalog tidak memberikan kepemilikan atas kamus yang sudah ada.

Opsi

Tentukan tokenizer_wholeword opsi di CREATE TEXT SEARCH DICTIONARY atau ALTER TEXT SEARCH DICTIONARY. Nama opsi tidak sensitif terhadap huruf besar/kecil.

Option Tipe Bawaan Description
Lowercase Boolean true Mengonversi token menjadi huruf kecil sebelum menerapkan operasi lain. Stemmer = 'english' membutuhkan Lowercase = 'true'.
Normalize NFC, NFD, NFKC, NFKD, atau none none Menerapkan formulir normalisasi Unicode yang dipilih. Ini mengkanonisasi representasi tetapi tidak menghilangkan karakter. Misalnya, NFC membuat aksen akut yang sudah dikomposisi é dan e diikuti oleh ekuivalen aksen akut yang menggabungkan.
EnglishPossessive Boolean true Menghapus bagian belakang 's, ’s, atau 's ketika setidaknya satu karakter mendahului sufiks. Akhiran mandiri tetap tidak berubah.
StripAccents Boolean false Menerapkan normalisasi NFKD dan menghapus tanda penggabungan. Misalnya, café menjadi cafe. Ketika opsi ini diaktifkan, hilangkan karena Normalize langkah NFKD membuat normalisasi Unicode terpisah menjadi redundansi.
Stopwords nama set None Menggunakan himpunan bernama dari tokenizer_ext.lakebase_tokenizer_stopwords.
Synonyms nama set None Menggunakan set pengganti satu-ke-satu yang dinamai dari tokenizer_ext.lakebase_tokenizer_synonyms.
Stemmer english None Menggunakan stemmer Inggris Snowball 3.1.0 yang dibundel. Hilangkan opsi ini untuk menonaktifkan stemming. Stemmer tidak menyertakan daftar kata penghenti.

Tabel katalog

Tabel Columns Description
lakebase_tokenizer_stopwords name text, word text Menyimpan set stopword bernama untuk template tokenizer yang mendukung Stopwords. Kunci utamanya adalah (name, word).
lakebase_tokenizer_synonyms name text, word text, synonym text Menyimpan pengganti satu-ke-satu yang diberi nama untuk template tokenizer yang mendukung Synonyms. Kunci utamanya adalah (name, word).

Gunakan peringkat BM25 dengan lakebase_text

Konfigurasi pencarian teks yang dibangun dengan lakebase_tokenizer menghasilkan nilai PostgreSQL tsvector standar yang kompatibel dengan lakebase_text. Untuk menggunakan peringkat relevansi BM25 dan pengambilan top-K, buat lakebase_bm25 indeks pada kolom yang sama tsvector . Untuk instalasi, pembuatan indeks, dan sintaks kueri, lihat lakebase_text.

Langkah berikutnya