סקירה כללית של חיפוש וקטורי מסונן ב-AlloyDB Omni

בוחרים גרסת תיעוד:

בדף הזה יש סקירה כללית על חיפוש וקטורי מסונן ב-AlloyDB Omni.

חיפוש וקטורי עם סינון מורכב מווקטור שאילתה וממסנן לשדה ספציפי.‏ AlloyDB Omni משתמש ביכולות השאילתה העשירות של PostgreSQL, ומאפשר לכם לבצע חיפוש וקטורי ולשאול שאילתות לגבי נתונים מובנים ולא מובנים מממשק SQL יחיד.

אפשרויות סינון

אופטימיזציית השאילתות ב-AlloyDB Omni ממלאת תפקיד חשוב בקביעת אסטרטגיית הסינון היעילה ביותר לחיפוש הווקטורים.

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

בהתאם לאומדן העלויות, הכלי לאופטימיזציה בוחר אסטרטגיית סינון אופטימלית מבין האפשרויות הבאות:

סינון מראש

סינון מראש הוא אסטרטגיה לאופטימיזציה של שאילתות, שבה AlloyDB Omni משתמש במסננים שלכם כדי למצוא קבוצה קטנה יותר של פריטים שתואמים לקריטריונים שלכם, במקום לחפש בכל מערך הנתונים. לאחר מכן, מערכת AlloyDB Omni מריצה את החיפוש הווקטורי על הקבוצה הקטנה יותר.

לדוגמה, אם אתם מחפשים חולצות כחולות דומות, קודם כל AlloyDB Omni ימצא את כל החולצות הכחולות ואז יחפש פריטים דומים בתוך הקבוצה הזו.

השיטה הזו משפרת את הביצועים כי היא מפעילה את חיפוש הדמיון הווקטורי שדורש הרבה משאבים חישוביים על מערך נתונים מצומצם.

סינון אחרי העיבוד

סינון לאחר החיפוש היא אסטרטגיה ש-AlloyDB Omni משתמש בה כשהמסננים לא מצמצמים את התוצאות באופן משמעותי. במקום לסנן קודם, AlloyDB Omni מתחיל בחיפוש רשימה רחבה של פריטים דומים על סמך חיפוש הווקטורים. לאחר מכן, הוא בודק את התוצאות לפי תנאי הסינון כדי ליצור את הרשימה הסופית.

לדוגמה, אם מחפשים סרטים דומים ויש לכם מסנן רחב מאוד כמו genre = drama,‏ AlloyDB Omni קודם מוצא קבוצה גדולה של סרטים שדומים לחיפוש שלכם ואז מסנן אותם לפי ז'אנר, כי רוב הסרטים יכולים להיות דרמות.

השיטה הזו יעילה כשצפויות הרבה תוצאות שתואמות למסנן.

סינון בתוך השורה

סינון מוטבע הוא אסטרטגיה לאופטימיזציה של שאילתות, שבה AlloyDB Omni משתמש באינדקסים וקטוריים ובאינדקסים משניים אחרים כדי לבצע חיפוש וקטורי והערכת סינון במקביל. ‫AlloyDB Omni מחפש באינדקס הווקטורים וקטורים דומים, וגם בודק אם כל וקטור תואם לתנאי המסנן של המטא-נתונים. כדי לבצע הערכה מהירה של התנאים האלה, הוא משתמש באינדקסים כמו B-trees, ‏ GIN או GiST.

לדוגמה, אם מחפשים נעליים דומות ומסננים לפי color = black, סינון מוטבע אומר ש-AlloyDB Omni יבדוק רק את הדמיון של נעליים שכבר שחורות. השיטה הזו יעילה יותר מאשר בדיקת הדמיון של כל הנעליים ואז סינון לפי צבע, או סינון כל הנעליים לפי צבע ואז בדיקת הדמיון.

סינון מוטבע מצטיין כשהמסננים מצמצמים את התוצאות באופן מתון.

הסבר על תוכניות שאילתות

תוכנית שאילתה מספקת תצוגה מקיפה של תהליך הביצוע של השאילתה, ומראה איזו אסטרטגיית סינון נבחרה על ידי AlloyDB Omni לפעולת סריקת הווקטור בשדה אסטרטגיית ביצוע.

תוכנית שאילתה לסינון מוטבע

לסינון מוטבע, AlloyDB Omni משתמש בצומת של תוכנית סריקה בהתאמה אישית, שנקראת גם סריקת וקטורים, שמסתמכת על צומת של תוכנית סריקת אינדקס של מפת סיביות כדי לספק את מפת הסיביות עבור סעיפי הסינון.

הסריקה הווקטורית מחשבת מרחקים רק לשורות שעומדות בקריטריונים של המסנן.

שאילתת החיפוש הבאה מדגימה סינון מוטבע של חיפוש shoes שבוצע סינון לפי color = black

EXPLAIN
SELECT *
FROM products
WHERE color = 'black'
ORDER BY embedding <=> embedding('text-embedding-005', 'shoes')::vector
LIMIT 10;

תוכנית השאילתה הבאה ממחישה חיפוש וקטורי אופטימלי באמצעות סינון מוטבע:

Limit (actual rows=10)
  ->  Custom Scan (vector scan) on products
      Execution Strategy: Bitmap assisted vector Scan on products_embedding_index
      Order By: (embedding <=> '[...]')::vector)
      Limit: 10
      ->  Bitmap Index Scan on products (color_index)
          Index Cond: (color = 'black')

בתוכנית השאילתות לדוגמה, Limit (actual rows=10) מראה שהשאילתה השתמשה בסעיף LIMIT 10; של SQL כדי להגביל את הפלט. ‫actual rows=10 אומר שהצומת הזה החזיר 10 שורות במהלך הרצת השאילתה.

הצומת -> Custom Scan (vector scan) on products מייצג פעולת חיפוש וקטורי. זו סריקה בהתאמה אישית כי זו סריקה מיוחדת של נתוני וקטור, והיא פועלת בטבלה products. בתוכנית השאילתה לדוגמה של סינון מוטבע מוצג הערך Bitmap assisted vector Scan on products_embedding_index בשדה Execution Strategy, שמציין שסריקת הווקטורים משתמשת במפת הסיביות כדי ליצור רשימה קצרה של שורות שצריך לבצע בהן חיפוש דמיון. הסריקה של אינדקס מפת הסיביות משמשת לסינון הנתונים על סמך התנאי color = 'black'.

המאפיין Order By: (embedding <=> '[...]')::vector מציין שהתוצאות מסודרות לפי דמיון וקטורי, שמחושב באמצעות הביטוי (embedding <=> '[...]')::vector, כאשר embedding מתייחס לעמודת הווקטור, <=> מייצג את האופרטור של השכן הקרוב ביותר, [...] הוא וקטור השאילתה ו-::vector מבצע המרה של סוג הנתונים לסוג הנתונים וקטור.

הצומת -> Bitmap Index Scan on products (color_index) מייצג סריקה של אינדקס מפת סיביות ב-colors_index. סריקה של אינדקס מפת סיביות בוחרת שורות שתואמות לתנאי הסינון באמצעות מפת סיביות, ומשתמשת ב-color_index לסינון.

המאפיין Index Cond: (color = 'black') מציין את תנאי הסינון שמשמש את סריקת האינדקס color = 'black' מהתנאי WHERE של השאילתה.

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