יצירה וניהול של אינדקס BM25

במסמך הזה מוסבר איך ליצור אינדקסים של BM25 (ההתאמה הטובה ביותר מתוך 25) כדי לבצע אופטימיזציה של חיפוש טקסט מלא ב-AlloyDB ל-PostgreSQL. הוא כולל דוגמאות לתרחישי שימוש נפוצים, כולל דירוג חיפושים, הגדרת פרמטרים של רוויה והתאמת משקלים של נורמליזציה.

‫BM25 הוא אלגוריתם הסתברותי לדירוג, שנמצא בשימוש נרחב להערכת הרלוונטיות של מסמך לשאילתה מסוימת. הוא מעריך את תדירות המונח (TF), את תדירות המסמך ההפוכה (IDF) ואת הנורמליזציה של אורך המסמך כדי לספק דירוגים מדויקים יותר של תוצאות החיפוש בהשוואה לחיפוש טקסט רגיל.

לפני שמתחילים

כדי להשתמש באינדקס BM25, צריך להפעיל את התוסף pg_textsearch ולעמוד בדרישות הבאות:

הפעלת התוסף pg_textsearch

צריך להפעיל את התוסף pg_textsearch לכל מסד נתונים:

  1. מתחברים למסד הנתונים של AlloyDB באמצעות psql או לקוח אחר. מידע נוסף זמין במאמר חיבור למופע של אשכול.
  2. מריצים את פקודת ה-SQL הבאה כדי ליצור את התוסף:

    CREATE EXTENSION IF NOT EXISTS pg_textsearch;
    

יצירת אינדקס BM25

בדוגמה הבאה נוצרת טבלה בשם documents עם תוכן column כדי ליצור אינדקס של נתוני טקסט לשאילתות דמיון של BM25.

  1. צור טבלה בשם documents:

    CREATE TABLE documents (
      id SERIAL PRIMARY KEY,
      title TEXT NOT NULL,
      content TEXT NOT NULL
    );
    
  2. מאכלסים את הטבלה בנתונים לדוגמה:

    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. יצירת אינדקס 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);

המאמרים הבאים