בדף הזה יש סקירה כללית של חיפוש וקטורי מסונן ב-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.
בתוכנית השאילתה לדוגמה של סינון מוטבע, השדה 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 של השאילתה.