Membuat dan mengelola indeks BM25

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:

Mengaktifkan ekstensi pg_textsearch

Anda harus mengaktifkan ekstensi pg_textsearch untuk setiap database:

  1. Hubungkan ke database AlloyDB menggunakan psql atau klien lain. Untuk mengetahui informasi selengkapnya, lihat Menghubungkan ke instance cluster.
  2. 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.

  1. Buat tabel bernama documents:

    CREATE TABLE documents (
      id SERIAL PRIMARY KEY,
      title TEXT NOT NULL,
      content TEXT NOT NULL
    );
    
  2. 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');
    
  3. 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 adalah 1.2.
  • b (Opsional): Parameter normalisasi panjang dokumen. Nilai defaultnya adalah 0.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