Dokumen ini menunjukkan cara membuat indeks BM25 (Best Matching 25) untuk mengoptimalkan penelusuran teks lengkap di AlloyDB untuk PostgreSQL. Dokumen ini memberikan contoh untuk kasus penggunaan umum, termasuk penelusuran peringkat, konfigurasi parameter saturasi, dan penyetelan bobot normalisasi.
BM25 adalah algoritma peringkat probabilistik yang banyak digunakan untuk memperkirakan relevansi dokumen dengan kueri tertentu. Algoritma ini mengevaluasi Frekuensi Term (TF), Frekuensi Dokumen Terbalik (IDF), dan Normalisasi Panjang Dokumen untuk menawarkan peringkat penelusuran yang lebih akurat daripada penelusuran teks standar.
Sebelum memulai
Untuk menggunakan indeks BM25, Anda harus mengaktifkan ekstensi pg_textsearch dan memenuhi persyaratan berikut:
- Menggunakan PostgreSQL 17 atau 18: ekstensi
pg_textsearchhanya didukung di instance AlloyDB yang menjalankan PostgreSQL versi utama 17 atau 18. - Peran database: Anda harus memiliki peran database
alloydbsuperuser. Untuk mengetahui informasi selengkapnya, lihat Menambahkan akun pengguna atau layanan IAM ke cluster.
Mengaktifkan ekstensi pg_textsearch
Anda harus mengaktifkan ekstensi pg_textsearch untuk setiap database:
- Hubungkan ke database AlloyDB menggunakan
psqlatau klien lain. Untuk mengetahui informasi selengkapnya, lihat Menghubungkan ke instance cluster. Jalankan perintah SQL berikut untuk membuat ekstensi:
CREATE EXTENSION IF NOT EXISTS pg_textsearch;
Membuat indeks BM25
Contoh berikut membuat tabel bernama documents dengan column konten untuk mengindeks data teks untuk kueri kemiripan BM25.
Buat tabel bernama
documents:CREATE TABLE documents ( id SERIAL PRIMARY KEY, title TEXT NOT NULL, content TEXT NOT NULL );Isi tabel dengan data contoh:
INSERT INTO documents (title, content) VALUES ('Database systems', 'AlloyDB is a fully managed PostgreSQL-compatible database service'), ('Google Cloud FTS', 'Full-text search lets you identify natural-language documents'), ('Probabilistic Ranking', 'BM25 uses term frequency and document length normalization');Buat indeks BM25 di kolom
content:CREATE INDEX idx_docs_bm25 ON documents USING bm25 (content) WITH (text_config = 'english');
Indeks mendukung tiga parameter dalam klausa WITH:
text_config(Wajib): Konfigurasi penelusuran teks PostgreSQL yang akan digunakan (misalnya,english).k1(Opsional): Parameter saturasi frekuensi term. Nilai defaultnya adalah1.2.b(Opsional): Parameter normalisasi panjang dokumen. Nilai defaultnya adalah0.75.
Membuat kueri menggunakan indeks BM25
Untuk melakukan peringkat relevansi terhadap indeks BM25, gunakan operator <@>.
Operator <@> menampilkan skor BM25 negatif. Hal ini karena PostgreSQL hanya mendukung pemindaian indeks menaik (ASC) pada operator. Skor yang lebih rendah (lebih negatif) menunjukkan kecocokan relevansi yang lebih kuat.
Jalankan kueri penelusuran yang diurutkan berdasarkan skor BM25 dalam urutan menaik:
SELECT title, content, content <@> 'database system' AS score
FROM documents
ORDER BY content <@> 'database system' ASC
LIMIT 5;
Output menampilkan dokumen yang sangat relevan di bagian atas dengan skor negatif terendah:
title | content | score
------------------+----------------------------------------------------------------------+----------
Database systems | AlloyDB is a fully managed PostgreSQL-compatible database service | -0.9971461892127991
Google Cloud FTS | Full-text search lets you identify natural-language documents | 0
Probabilistic ranking | BM25 uses term frequency and document length normalization | 0
(3 rows)
Menyetel parameter indeks BM25
Anda dapat menyesuaikan parameter untuk mengoptimalkan peringkat untuk berbagai jenis koleksi dokumen.
- Tingkatkan
k1: Jika Anda ingin istilah kueri diulang beberapa kali untuk meningkatkan skor dokumen secara konsisten. - Tingkatkan
b: Jika Anda ingin dokumen yang lebih panjang dikenai penalti yang lebih berat karena menyertakan istilah lain-lain.
Untuk membuat indeks yang disesuaikan untuk dokumen pendek yang memprioritaskan frekuensi term, tetapkan k1 ke 1.5 dan b ke 0.8:
CREATE INDEX idx_docs_bm25_tuned
ON documents
USING bm25 (content)
WITH (text_config = 'english', k1 = 1.5, b = 0.8);
Langkah berikutnya
- Pelajari tentang penelusuran teks lengkap.
- Pelajari cara Menjalankan penelusuran kemiripan vektor campuran.