שאילתות וקטוריות פועלות על ידי חיפוש במסד נתונים וקטורי כדי למצוא וקטורים שתואמים בצורה הטובה ביותר לווקטור השאילתה. בדף הזה מוסבר איך זה עובד.
חיפוש וקטורים דומים
שאילתות של חיפוש וקטורי משתמשות בשתי אסטרטגיות:
- שכנים קרובים (KNN): מוצא את k הווקטורים הקרובים ביותר לווקטור השאילתה.
- שכנים קרובים משוערים (ANN): מציאת k הווקטורים הקרובים ביותר לווקטור השאילתה
כדי להשתמש ב-KNN, צריך ליצור אינדקסים עם סוג האינדקס וקטורי FLAT. עם KNN, שאילתות החיפוש יהיו מדויקות, אבל החיפוש יהיה איטי יותר. כדי להשתמש ב-ANN, צריך ליצור אינדקסים עם סוג האינדקס וקטורי HNSW. עם ANN, שאילתות החיפוש יהיו משוערות, אבל החיפוש יהיה מהיר יותר. אפשר לשפר את הדיוק של ANN על ידי שינוי הפרמטרים של אינדקס HNSW והפרמטר EF_RUNTIME בשאילתה.
פירוט של תחביר השאילתות
FT.SEARCH index "(hybrid_filter_expression)=>[KNN num_neighbours @my_vector_hash_key $my_vector_query_param]" PARAMS 2 my_vector_query_param "query_embedding" DIALECT 2
index: השם של האינדקס שמכיל את שדה הווקטור.
(hybrid_filter_expression): זהו ביטוי הסינון ההיברידי. רק תגיות ואינדקסים מספריים נתמכים בביטויי סינון. פרטים נוספים על ביטויי סינון זמינים במאמר בנושא שאילתות היברידיות.- אפשר להשתמש ב-
(*)כדי להריץ שאילתות שלא דורשות סינון.
- אפשר להשתמש ב-
=>: מפריד בין המסנן לבין החיפוש הווקטורי.
[KNN num_neighbours @field $vector]: ביטוי החיפוש של KNN. מחליפים אתnum_neighborsבמספר התוצאות הרצוי ואת@fieldבשם של שדה הווקטור.PARAMS 2 my_vector_query_param "query_embedding":- הערך
2אחריPARAMSמציין שצריך לספק עוד שני ארגומנטים. -
my_vector_query_paramהוא שם הווקטור של פרמטר השאילתה, כפי שצוין בביטוי החיפוש של KNN. - מחליפים את
query_embeddingבווקטור של השאילתה המוטמעת.
- הערך
DIALECT 2: מציין שאתם משתמשים בגרסה 2 או בגרסה מתקדמת יותר של ניב השאילתות (נדרש לחיפוש וקטורי).
שאילתות היברידיות
הביטוי הראשוני שמוקף בסוגריים () הוא ביטוי סינון. ביטויים של מסננים מאפשרים לסנן וקטורים במהלך ההרצה של חיפוש וקטורי. שאילתה שמשתמשת בביטוי סינון כדי לסנן תוצאות נקראת שאילתה היברידית. כל שילוב של תג ומדדים מספריים יכול ליצור שאילתה היברידית.
ב-Memorystore for Redis יש שתי גישות לסינון חיפושים של וקטורים:
- סינון מראש: סינון מראש מסתמך על אינדקסים משניים (למשל, תג, מספרי) כדי למצוא קודם את ההתאמות לביטוי המסנן, ללא קשר לדמיון הווקטורי. אחרי חישוב התוצאות המסוננות, מתבצע חיפוש בכוח כדי למיין לפי דמיון וקטורי.
- סינון מוטבע: סינון מוטבע מפעיל את אלגוריתם החיפוש הווקטורי (למשל HNSW), ומתעלם מווקטורים שנמצאו שלא תואמים למסנן.
סינון מראש מהיר יותר כשמרחב החיפוש המסונן קטן בהרבה ממרחב החיפוש המקורי. כשמרחב החיפוש המסונן גדול, סינון מוטבע מהיר יותר. Memorystore for Redis בוחר אוטומטית בין שתי האסטרטגיות על סמך המסנן שסופק.
ביטויי סינון תומכים גם בתגים וגם באינדקסים מספריים.
אינדקס תגים
תגים הם שדות טקסט שמתפרשים כרשימת תגים שמופרדים באמצעות תו מפריד. בדרך כלל, תגים הם קבוצות קטנות של ערכים עם ערכים אפשריים מוגבלים, כמו צבע, ז'אנר של ספר, שם עיר או מחבר.
- אפשר להשתמש רק בשדות שנוספו לאינדקס כמסנן תגים.
- השדות של התג עוברים טוקניזציה באמצעות תו מפריד, שהוא פסיק ',' כברירת מחדל, אבל אפשר להגדיר אותו במהלך יצירת האינדקס.
- לא מתבצעת גזירה של מילים בזמן יצירת אינדקס של שדה תג.
- אפשר להשתמש בשדה תג רק כדי לסנן לפי קידומת או לפי התאמה מדויקת של קידומת. אי אפשר לסנן לפי סיומת או לפי מילה באמצע.
- כברירת מחדל, התגים לא תלויי-רישיות. לדוגמה, התגים Blue ו-BLUE יאונדקסו כ-blue ויניבו את אותה תוצאה בשאילתה היברידית.
- מחרוזות ריקות לא נכללות באינדקס ולא מתבצעות לגביהן שאילתות.
- במהלך ההוספה לאינדקס והשאילתות, כל הרווחים הלבנים בסוף השורה מוסרים.
תחביר
התווים { ו-} הם חלק מהתחביר, והתו | משמש כאופרטור OR כדי לתמוך במספר תגים:
@:{ | | ...}
לדוגמה, השאילתה הבאה תחזיר מסמכים עם צבע כחול או שחור או ירוק.
@color:{blue | black | green}
דוגמה נוספת: השאילתה הבאה תחזיר מסמכים שמכילים את המחרוזות 'hello world' או 'hello universe'
@color:{hello world | hello universe}
אינדקס מספרי
אינדקסים מספריים מאפשרים לסנן שאילתות כדי להחזיר רק ערכים שנמצאים בין ערך התחלה וערך סיום נתונים.
- יש תמיכה בשאילתות כוללות וגם בשאילתות לא כוללות.
- בשאילתות פתוחות, אפשר להשתמש בערכים +inf ו--inf כדי לציין טווחים של התחלה וסיום.
לדוגמה, השאילתה הבאה תחזיר ספרים שפורסמו בין 2021 ל-2024 (כולל). הביטוי המתמטי המקביל הוא 2021 <= year <= 2024.
"@year:[2021 2024]"
השאילתה הבאה תחזיר ספרים שפורסמו בין 2021 (לא כולל) ל-2024 (כולל). הביטוי המתמטי המקביל הוא 2021 < year <= 2024.
@year:[(2021 2024]
השאילתה הבאה תחזיר ספרים שפורסמו לפני 2024 (כולל). הביטוי המתמטי המקביל הוא year <= 2024.
@year:[(-inf 2024]
השאילתה הבאה תחזיר ספרים שפורסמו אחרי 2015 (לא כולל). הביטוי המתמטי המקביל הוא year >= 2015.
@year:[2015 +inf]
הטבלה הבאה יכולה לשמש כמדריך למיפוי של ביטויים מתמטיים לשאילתות של סינון מראש:
| ביטוי מתמטי | ביטוי סינון |
|---|---|
| min <= field <= max | @field:[min max] |
| min < field <= max | @field:[(min max] |
| min <= field < max | @field:[min (max] |
| min < field < max | @field:[(min (max] |
| field => min | @field:[min +inf] |
| שדה > דקות | @field:[(min +inf] |
| field <= max | @field:[-inf max] |
| field < max | @field:[-inf (max] |
| field == val | @field:[val val] |
אופרטורים לוגיים
אפשר להשתמש בכמה תגים ובשדות מספריים כדי ליצור שאילתות מורכבות באמצעות אופרטורים לוגיים.
וגם לוגי
כדי להגדיר AND לוגי, משתמשים ברווח בין פרדיקטים. לדוגמה:
query1 query2 query3
OR לוגי
כדי להגדיר OR לוגי, משתמשים בתו '|' בין התנאים. לדוגמה:
query1 | query2 | query3
שלילה לוגית
אפשר לשלול כל שאילתה על ידי הוספת - לפני כל שאילתה. שאילתות שליליות מחזירות את כל הערכים שלא תואמים לשאילתה. זה כולל גם מסמכים שבהם השדה לא מופיע.
לדוגמה, שאילתה שלילית על @genre:{comedy} תחזיר את כל הספרים שהם לא קומדיה וגם את כל הספרים שלא כוללים שדה של ז'אנר.
השאילתה הבאה תחזיר את כל הספרים עם הז'אנר 'קומדיה' שלא פורסמו בין 2015 ל-2024, או שאין להם שדה שנה:
@genre:[comedy] -@year:[2015 2024]
דוגמאות לשילוב של אופרטורים לוגיים
אפשר לשלב אופרטורים לוגיים כדי ליצור ביטויי סינון מורכבים.
השאילתה הבאה תחזיר את כל הספרים בז'אנרים 'קומדיה' או 'אימה' (וגם) שפורסמו בין 2015 ל-2024:
@genre:[comedy|horror] @year:[2015 2024]
השאילתה הבאה תחזיר את כל הספרים מהז'אנרים 'קומדיה' או 'אימה' (OR) שפורסמו בין 2015 ל-2024:
@genre:[comedy|horror] | @year:[2015 2024]
השאילתה הבאה תחזיר את כל הספרים שפורסמו בין 2015 ל-2024, שאין להם שדה ז'אנר או שיש להם שדה ז'אנר שלא שווה ל-"קומדיה":
-@genre:[comedy] @year:[2015 2024]
מידע על השימוש מופיע במאמר בנושא FT.SEARCH.