בדף הזה מוסבר על חיפוש וקטורי מסונן ב-AlloyDB ל-PostgreSQL.
חיפוש וקטורי עם מסנן מורכב מווקטור שאילתה וממסנן לשדה ספציפי. AlloyDB משתמש ביכולות השאילתות העשירות של PostgreSQL, ומאפשר לכם לבצע חיפוש וקטורי ולשאול שאילתות על נתונים מובְנים וגם על נתונים לא מובְנים מממשק SQL יחיד.
אפשרויות הסינון
אופטימיזציית השאילתות של AlloyDB ממלאת תפקיד חשוב בקביעת אסטרטגיית הסינון היעילה ביותר לחיפוש הווקטורי.
כדי להעריך את העלות של תוכניות ביצוע שונות, האופטימיזציה של השאילתה מנתחת את השאילתה ומתחשבת בגורמים כמו סלקטיביות של מסננים, חלוקת נתונים וזמינות של אינדקסים.
על סמך הערכת העלויות, הכלי לאופטימיזציה בוחר אסטרטגיית סינון אופטימלית מבין האפשרויות הבאות:
סינון מקדים
סינון מוקדם הוא אסטרטגיה לאופטימיזציה של שאילתות, שבה AlloyDB משתמש במסננים שלכם כדי למצוא קבוצה קטנה יותר של פריטים שתואמים לקריטריונים שלכם, במקום לחפש בכל מערך הנתונים. לאחר מכן, מערכת AlloyDB מריצה את חיפוש הווקטורים בקבוצה הקטנה יותר הזו.
לדוגמה, אם אתם מחפשים חולצות כחולות דומות, מערכת AlloyDB קודם מוצאת את כל החולצות הכחולות ואז מחפשת פריטים דומים בתוך הקבוצה הזו.
השיטה הזו משפרת את הביצועים כי היא מפעילה את חיפוש הדמיון הווקטורי שדורש הרבה משאבים חישוביים על מערך נתונים מצומצם.
סינון משני
סינון אחרי החיפוש הוא אסטרטגיה ש-AlloyDB משתמש בה כשהמסננים לא מצמצמים את התוצאות באופן משמעותי. במקום להתחיל בסינון, AlloyDB מתחיל בחיפוש רשימה רחבה של פריטים דומים על סמך חיפוש הווקטורים. לאחר מכן, המערכת בודקת את התוצאות בהשוואה לתנאי המסנן כדי ליצור את הרשימה הסופית.
לדוגמה, אם מחפשים סרטים דומים ויש מסנן רחב מאוד כמו genre = drama, AlloyDB קודם מוצא קבוצה גדולה של סרטים שדומים לחיפוש ואז מסנן אותם לפי ז'אנר, כי רוב הסרטים יכולים להיות דרמות.
השיטה הזו יעילה כשצפויות הרבה תוצאות שתואמות למסנן.
סינון בתוך השורה
סינון מוטבע הוא אסטרטגיה לאופטימיזציה של שאילתות שבה AlloyDB משתמש גם בווקטורים וגם באינדקסים משניים אחרים כדי לבצע חיפוש וקטורים והערכת סינון במקביל. מערכת AlloyDB מחפשת באינדקס הווקטורי וקטורים דומים, ובודקת גם אם כל וקטור תואם לתנאי המסנן של המטא-נתונים. היא משתמשת באינדקסים כמו B-trees, GIN או GiST כדי להעריך במהירות את התנאים האלה.
לדוגמה, אם מחפשים נעליים דומות ומסננים לפי color = black, סינון מוטבע אומר ש-AlloyDB בודק רק את הדמיון של נעליים שכבר שחורות. השיטה הזו יעילה יותר מאשר בדיקת הדמיון של כל הנעליים ואז סינון לפי צבע, או סינון כל הנעליים לפי צבע ואז בדיקת הדמיון.
סינון מוטבע מצטיין כשהמסננים מצמצמים את התוצאות באופן מתון.
הסבר על תוכניות שאילתות
תוכנית לביצוע שאילתה מספקת תצוגה מקיפה של תהליך הביצוע של השאילתה, ומראה איזו אסטרטגיית סינון נבחרה על ידי AlloyDB לפעולת הסריקה של הווקטור בשדה Execution Strategy (אסטרטגיית ביצוע).
תוכנית לביצוע שאילתה לסינון מוטבע
לסינון מוטבע, AlloyDB משתמש בצומת של תוכנית סריקה בהתאמה אישית, שנקרא גם סריקת וקטורים, שמסתמך על צומת של תוכנית סריקת אינדקס של מפת סיביות כדי לספק את מפת הסיביות לסעיפי הסינון.
הסריקה הווקטורית מחשבת מרחקים רק לשורות שעומדות בקריטריונים של המסנן.
שאילתת החיפוש הבאה מדגימה סינון מוטבע של חיפוש 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. סריקה של אינדקס bitmap בוחרת שורות שתואמות לתנאי הסינון באמצעות bitmap, ומשתמשת ב-color_index לסינון.
המאפיין Index Cond: (color = 'black') מציין את תנאי הסינון שמשמש את סריקת האינדקס color = 'black' מהתנאי WHERE של השאילתה.
שיטות מומלצות לחיפוש וקטורי מסונן
אם השאילתות שלכם לחיפוש וקטורי כוללות מסננים, מומלץ ליצור אינדקס B-tree בעמודות שמשמשות במסננים האלה, בלי קשר לסוג האינדקס הווקטורי שבו אתם משתמשים (ScaNN, HNSW או IVFFlat).