אפשר להשתמש בתכונות של חיפוש טקסט ב-Cloud Firestore כדי לחפש מחרוזות ספציפיות באוסף.
לפני שמתחילים
לפני שמתחילים להשתמש בשאילתות טקסט, צריך לבצע את הפעולות הבאות:
מוודאים שיש לכם גישה למסד נתונים קיים של פעולות שתואם ל-MongoDB, או יוצרים מסד נתונים ומתחברים אליו.
מוודאים שיש אינדקס טקסט, או יוצרים אינדקס טקסט.
הרשאות IAM
כדי ליצור אינדקס ב-Cloud Firestore, צריך לוודא שהוקצה לכם אחד מהתפקידים הבאים:
roles/datastore.ownerroles/datastore.indexAdminroles/editorroles/owner
הוראות להקצאת תפקיד מופיעות במאמר הקצאת תפקיד יחיד. למידע נוסף על תפקידים וההרשאות שמשויכות אליהם, ראו תפקידים מוגדרים מראש.Cloud Firestore
אם הגדרתם תפקידים בהתאמה אישית, צריך להקצות את כל ההרשאות הבאות כדי ליצור אינדקסים:
datastore.indexes.createdatastore.indexes.deletedatastore.indexes.getdatastore.indexes.listdatastore.indexes.update
הרצת שאילתת טקסט
שאילתות טקסט משתמשות באופרטור $text בתוך מסנן.
מציינים את המחרוזת שנבדקת בארגומנט $search.
הרצת שאילתת טקסט כללית
כדי להריץ שאילתה כללית, מריצים את השאילתה הבאה:
# Find query
db.cities.find({ $text: { $search: "french bread" } })
# Aggregation query
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 query
db.cities.find({ $text: { $search: "\"best french bread\"" } })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "\"best french bread\"" } } },
]);
שאילתה של שילוב מונחים
כדי לדייק את השאילתה, מציינים שרשרת של מונחים. לדוגמה, השאילתה הבאה מחזירה מסמכים שתואמים לשילוב best AND french AND ("bread" OR "is"):
# Find query
db.cities.find({ $text: { $search: "\"best\" \"french\" bread is" } })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "\"best\" \"french\" bread is" } } },
]);
אי הכללת מונח
כדי להחריג מונח משאילתה, מוסיפים מקף (-) לפני המונח:
# Find query
db.cities.find({ $text: { $search: "best bread -french"} })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "best bread -french" } } },
]);
חישוב ציון הרלוונטיות
משתמשים בביטוי {$meta: "textScore"} כדי לחשב את ציון הרלוונטיות של המסמכים שתואמים לשאילתת הטקסט. כדי למיין את התוצאות בסדר יורד של הניקוד, משתמשים ב-$meta בביטוי מיון. בדוגמאות הבאות, SCORE_FIELD הוא שם השדה שמשמש לאחסון ערך הניקוד:
# Find query
db.cities
.find({ $text: { $search: "best french bread" } })
.sort({ SCORE_FIELD: { $meta: "textScore" } })
# Aggregation query
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $sort: { "SCORE_FIELD": { $meta: "textScore"} } },
]);
אפשר גם להשתמש בציון הטקסט בביטויי תחזית. לדוגמה:
# Find query
db.cities
.find({ $text: { $search: "best french bread" } })
.project({ score: { $meta: "textScore" } })
# Aggregation query
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.