אתם יכולים להשתמש בתכונות של חיפוש טקסט ב-Cloud Firestore כדי לחפש מחרוזות ספציפיות באוסף.
לפני שמתחילים
לפני שמתחילים להשתמש בחיפושי טקסט, צריך לבצע את הפעולות הבאות:
מוודאים שיש לכם גישה למסד נתונים קיים של פעולות שתואם ל-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" }
] );
הערך של המחיצה חייב להיות מחרוזת. מסנן המחיצה חייב להיות מחובר לחיפוש הטקסט באמצעות "and".
הגדרת השפה לחיפוש טקסט
אפשר להגדיר את שפת חיפוש הטקסט באמצעות הארגומנט $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.