שימוש בחיפוש טקסט

אפשר להשתמש בתכונות של חיפוש טקסט ב-Cloud Firestore כדי לחפש מחרוזות ספציפיות באוסף.

לפני שמתחילים

לפני שמתחילים להשתמש בחיפושי טקסט, צריך לבצע את הפעולות הבאות:

  1. מוודאים שיש לכם גישה למסד נתונים קיים של פעולות שתואם ל-MongoDB, או יוצרים מסד נתונים ומתחברים אליו.

  2. מוודאים שיש אינדקס טקסט, או יוצרים אינדקס טקסט.

חיפושי טקסט משתמשים באופרטור $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.