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

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

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

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

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

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

הרשאות IAM

כדי ליצור אינדקס ב-Cloud Firestore, צריך לוודא שהוקצה לכם אחד מהתפקידים הבאים:

  • roles/datastore.owner
  • roles/datastore.indexAdmin
  • roles/editor
  • roles/owner

הוראות להקצאת תפקיד מופיעות במאמר הקצאת תפקיד יחיד. למידע נוסף על תפקידים וההרשאות שמשויכות אליהם, ראו תפקידים מוגדרים מראש.Cloud Firestore

אם הגדרתם תפקידים בהתאמה אישית, צריך להקצות את כל ההרשאות הבאות כדי ליצור אינדקסים:

  • datastore.indexes.create
  • datastore.indexes.delete
  • datastore.indexes.get
  • datastore.indexes.list
  • datastore.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.