במסמך הזה מוסבר איך ליצור אינדקסים של BM25 (ההתאמה הטובה ביותר מתוך 25) כדי לבצע אופטימיזציה של חיפוש טקסט מלא ב-AlloyDB ל-PostgreSQL. הוא כולל דוגמאות לתרחישי שימוש נפוצים, כולל דירוג חיפושים, הגדרת פרמטרים של רוויה והתאמת משקלים של נורמליזציה.
BM25 הוא אלגוריתם הסתברותי לדירוג, שנמצא בשימוש נרחב להערכת הרלוונטיות של מסמך לשאילתה מסוימת. הוא מעריך את תדירות המונח (TF), את תדירות המסמך ההפוכה (IDF) ואת הנורמליזציה של אורך המסמך כדי לספק דירוגים מדויקים יותר של תוצאות החיפוש בהשוואה לחיפוש טקסט רגיל.
לפני שמתחילים
כדי להשתמש באינדקס BM25, צריך להפעיל את התוסף pg_textsearch ולעמוד בדרישות הבאות:
- שימוש ב-PostgreSQL 17 או 18: התוסף
pg_textsearchנתמך רק במכונות AlloyDB שמופעלות בגרסה ראשית 17 או 18 של PostgreSQL. - תפקיד במסד הנתונים: אתם צריכים להיות מוגדרים בתפקיד
alloydbsuperuserבמסד הנתונים. מידע נוסף זמין במאמר בנושא הוספת משתמש IAM או חשבון שירות לאשכול.
הפעלת התוסף pg_textsearch
צריך להפעיל את התוסף pg_textsearch לכל מסד נתונים:
- מתחברים למסד הנתונים של AlloyDB באמצעות
psqlאו לקוח אחר. מידע נוסף זמין במאמר חיבור למופע של אשכול. מריצים את פקודת ה-SQL הבאה כדי ליצור את התוסף:
CREATE EXTENSION IF NOT EXISTS pg_textsearch;
יצירת אינדקס BM25
בדוגמה הבאה נוצרת טבלה בשם documents עם תוכן column כדי ליצור אינדקס של נתוני טקסט לשאילתות דמיון של BM25.
צור טבלה בשם
documents:CREATE TABLE documents ( id SERIAL PRIMARY KEY, title TEXT NOT NULL, content TEXT NOT NULL );מאכלסים את הטבלה בנתונים לדוגמה:
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');יצירת אינדקס BM25 בעמודה
content:CREATE INDEX idx_docs_bm25 ON documents USING bm25 (content) WITH (text_config = 'english');
האינדקס תומך בשלושה פרמטרים בסעיף WITH שלו:
-
text_config(חובה): הגדרת חיפוש הטקסט של PostgreSQL לשימוש (לדוגמה,english). -
k1(אופציונלי): פרמטר הרוויה של תדירות המונח. ערך ברירת המחדל הוא1.2. -
b(אופציונלי): פרמטר הנורמליזציה של אורך המסמך. ערך ברירת המחדל הוא0.75.
שליחת שאילתות באמצעות אינדקס BM25
כדי לבצע דירוג רלוונטיות מול אינדקס BM25, משתמשים באופרטור <@>.
האופרטור <@> מחזיר ציון BM25 שלילי. הסיבה לכך היא ש-PostgreSQL תומך רק בסריקות אינדקס עולות (ASC) באופרטורים. ציון נמוך יותר (שלילי יותר) מצביע על התאמה חזקה יותר לרלוונטיות.
מריצים שאילתת חיפוש שממוינת לפי ציון BM25 בסדר עולה:
SELECT title, content, content <@> 'database system' AS score
FROM documents
ORDER BY content <@> 'database system' ASC
LIMIT 5;
הפלט מציג את המסמך הרלוונטי ביותר בחלק העליון עם הציון השלילי הנמוך ביותר:
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)
התאמת פרמטרים של אינדקס BM25
אתם יכולים לשנות את הפרמטרים כדי לשפר את הדירוג של סוגים שונים של אוספי מסמכים.
- הגדלה
k1: אם רוצים שמונחי שאילתה שחוזרים על עצמם מספר פעמים יגדילו באופן עקבי את הניקוד של המסמך. - הגדלה של
b: אם רוצים להטיל עונש חמור יותר על מסמכים ארוכים שכוללים מונחים שונים.
כדי ליצור אינדקס מותאם אישית למסמכים קצרים שבו יש עדיפות לתדירות המונחים,
מגדירים את k1 ל-1.5 ואת b ל-0.8:
CREATE INDEX idx_docs_bm25_tuned
ON documents
USING bm25 (content)
WITH (text_config = 'english', k1 = 1.5, b = 0.8);