חיפוש וקטורי מסונן ב-AlloyDB ל-PostgreSQL מאפשר לשלב חיפוש דמיון וקטורי עם מסנני SQL מובְנים בשאילתה אחת. כשמשלבים וקטור של שאילתה עם פרדיקטים של מטא-נתונים, אפשר לצמצם את תוצאות הדמיון לקבוצות משנה תואמות של הנתונים, בזמן שאופטימיזציית השאילתות של AlloyDB בוחרת באופן אוטומטי את אסטרטגיית הסינון היעילה ביותר.
אפשרויות סינון
הכלי לאופטימיזציה של שאילתות ב-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.
בתוכנית לביצוע שאילתה לדוגמה לסינון בתוך השורה, בשדה Execution Strategy מופיע הערך Bitmap assisted vector Scan on products_embedding_index. זה מציין שבסריקת הווקטורים נעשה שימוש במפת הסיביות כדי ליצור רשימה מצומצמת של שורות שבהן צריך לבצע חיפוש דמיון. סריקת אינדקס מפת הסיביות משמשת לסינון הנתונים על סמך התנאי color = 'black'.
המאפיין Order By: (embedding <=> '[...]')::vector מציין שהתוצאות מסודרות לפי דמיון וקטורי, שמחושב באמצעות הביטוי (embedding <=> '[...]')::vector, כאשר embedding מתייחס לעמודת הווקטור, <=> מייצג את אופרטור השכן הקרוב ביותר, [...] הוא וקטור השאילתה ו-::vector מבצע המרה של סוג הנתונים לסוג הנתונים של הווקטור.
הצומת -> Bitmap Index Scan on products (color_index) מייצג סריקת אינדקס של מפת סיביות (bitmap) ב-colors_index. סריקת אינדקס של מפת סיביות בוחרת שורות שתואמות לתנאי הסינון באמצעות מפת סיביות, ומשתמשת ב-color_index לסינון.
המאפיין Index Cond: (color = 'black') מציין את תנאי הסינון שבו משתמשת סריקת האינדקס color = 'black' מהסעיף WHERE של השאילתה.
שיטות מומלצות לחיפוש וקטורי מסונן
אם שאילתות החיפוש הווקטורי כוללות מסננים, מומלץ ליצור אינדקס B-tree בעמודות שמשמשות במסננים האלה, בלי קשר לסוג האינדקס הווקטורי שבו אתם משתמשים (ScaNN, HNSW או IVFFlat).