שימוש בחיפושי טקסט
אפשר להשתמש בתכונות של חיפוש טקסט ב-Firestore עם תאימות ל-MongoDB כדי לחפש מחרוזות ספציפיות באוסף.
לפני שמתחילים
לפני שמתחילים להשתמש בחיפושי טקסט, צריך לבצע את הפעולות הבאות:
מוודאים שיש לכם גישה למסד נתונים קיים של פעולות שתואם ל-MongoDB, או יוצרים מסד נתונים ומתחברים אליו.
מוודאים שיש לכם אינדקס טקסט, או יוצרים אינדקס טקסט.
איך מבצעים חיפוש טקסט
חיפושי טקסט משתמשים באופרטור $text בתוך מסנן.
מציינים את המחרוזת שנשאלה בארגומנט $search.
הרצת חיפוש טקסט כללי
מריצים את הפקודה הבאה כדי לבצע חיפוש טקסט כללי:
# Find search
db.cities.find({ $text: { $search: "french bread" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "french bread" } } }
]);
אם האינדקס מחולק למחיצות, אפשר לסנן לפי המחיצה על ידי הכללת המחיצה במסנן שוויון מסוג AND בחיפוש.
לדוגמה, אם יש לכם מחיצה city, תוכלו לסנן חיפוש טקסט באופן הבא:
db.myCollection.find( { $and: [
{ $text: { $search: "french bread" } },
{ "city": "Paris" }
] } )
אפשר גם לסנן צבירה על סמך מחיצה. לדוגמה:
db.myCollection.aggregate([
{ $match: { $text: { $search: "french bread" } } },
{ "city": "Paris" }
] );
הערך של המחיצה חייב להיות מחרוזת. מסנן המחיצה צריך להיות מחובר לחיפוש הטקסט באמצעות 'וגם'.
הגדרת השפה של חיפוש הטקסט
אפשר להגדיר את שפת החיפוש של הטקסט באמצעות הארגומנט $language. לדוגמה:
db.cities.find({ $text: { $search: "french bread", $language: "en"} })
אם לא מגדירים שפה, החיפוש מתבצע בשפה של אינדקס הטקסט.
חיפוש מונח מדויק
כדי לחפש מונח מדויק, צריך להגדיר את המונח כרצף של מילים שמוקף במירכאות כפולות. לדוגמה:
# Find search
db.cities.find({ $text: { $search: "\"best french bread\"" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "\"best french bread\"" } } },
]);
חיפוש שילוב של מונחים
כדי שהחיפוש שלכם יהיה מדויק יותר, אתם יכולים לציין שרשרת של מונחים. לדוגמה, החיפוש הבא מחזיר מסמכים שתואמים לשילוב best AND french AND ("bread" OR "is"):
# Find search
db.cities.find({ $text: { $search: "\"best\" \"french\" bread is" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "\"best\" \"french\" bread is" } } },
]);
החרגת מונח
כדי להחריג מונח מחיפוש טקסט, מוסיפים מקף (-) לפני המונח:
# Find search
db.cities.find({ $text: { $search: "best bread -french"} })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best bread -french" } } },
]);
חישוב ציון הרלוונטיות
משתמשים בביטוי {$meta: "textScore"} כדי לחשב את ציון הרלוונטיות של המסמכים שתואמים לחיפוש הטקסט. כדי למיין את התוצאות בסדר יורד של הניקוד, משתמשים ב-$meta בביטוי מיון. בדוגמאות הבאות, SCORE_FIELD הוא שם השדה שמשמש לאחסון ערך הניקוד:
# Find search
db.cities
.find({ $text: { $search: "best french bread" } })
.sort({ SCORE_FIELD: { $meta: "textScore" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $sort: { "SCORE_FIELD": { $meta: "textScore"} } },
]);
אפשר גם להשתמש בציון הטקסט בביטויי תחזית. לדוגמה:
# Find search
db.cities
.find({ $text: { $search: "best french bread" } })
.project({ score: { $meta: "textScore" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $project: { "scoreField": { $meta: "textScore"} } },
]);
הרחבת החיפוש
כדי לשפר את הרלוונטיות של תוצאות חיפוש הטקסט, האופרטור $text מרחיב את מחרוזת החיפוש בהתאם לשפה שצוינה, כך שיכללו התאמות למילים נרדפות בהתאם להקשר, לצורות של מילים אחרי הסרת הסיומת, למונחים עם תיקון שגיאות איות, לווריאציות של סימנים דיאקריטיים ועוד.
מגבלות
- אי אפשר להשתמש באופרטורים
$nearו$textבאותו חיפוש טקסט. - מותר להשתמש באופרטור
$textאחד בלבד לכל חיפושfindאוaggregation. - בצבירות, שלב
$matchעם$textחייב להיות השלב הראשון בצינור. - אפשר להוסיף את התג
$textרק בתוך התגים$andו-$or. - אם
$textנמצא בתוך$or, יכול להיות שהמערכת תשתמש באינדקסים קיימים מסודרים כדי לבצע אופטימיזציה של החיפוש. אם שאר החלקים של הביטוי לא נמצאים באינדקס, החיפוש מתבסס על סריקה של האוסף. - אי אפשר להשתמש ב-
$textעם רמזים. - אי אפשר למיין שאילתות עם חיפוש טקסט לפי
$natural.