ביצוע חיפוש טקסט מלא באמצעות Data Connect

Firebase Data Connect תומך בחיפוש טקסט מלא, שמבוסס על PostgreSQL. חיפוש טקסט מלא מאפשר לכם לאתר מידע במהירות וביעילות בתוך מערכי נתונים גדולים, על ידי חיפוש מילות מפתח וביטויים בכמה עמודות בו-זמנית.

אפשר להוסיף לשירות חיפוש טקסט מלא. קודם מוסיפים את ההנחיה @searchable ל-String בסכימה שרוצים לחפש בה. לדוגמה:

type Movie
  @table {

  # The fields you want to search over
  title: String! @searchable
  genre: String @searchable
  description: String @searchable
  tags: [String]

  # Some other fields that we won't search over
  rating: Float
  imageUrl: String!
  releaseYear: Int
}

אחרי שמוסיפים את ההנחיה הזו, אפשר לבצע חיפוש טקסט מלא על ידי הוספת השדה <pluralType>_search לשאילתה. במקרה הזה, זה יהיה movies_search:

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query) {
    id
    title
    imageUrl
    releaseYear
    genre
    rating
    tags
    description
  }
}

שיפור תוצאות החיפוש בטקסט מלא

אפשר לשפר את תוצאות החיפוש בטקסט מלא על ידי הוספת ארגומנטים להנחיה @searchable ולשדה _search.

ארגומנטים משותפים

אפשר לשלוט בתוצאות החיפוש באמצעות הרבה מאותם ארגומנטים שמשמשים לשדות רשימה בסיסיים <pluralType>:

  • order מאפשר לשנות את סדר התוצאות. אם לא מציינים ערך, התוצאות ממוינות לפי רלוונטיות בסדר יורד.
  • where מאפשר להוסיף מסננים נוספים לחיפוש (לדוגמה, חיפוש רק של סרטים מז'אנר מסוים).
  • limit גורם לכך שהשאילתה תחזיר רק את X התוצאות המובילות.
  • offset גורם לשאילתה לדלג על X התוצאות הראשונות.
  • distinct מוסיף את האופרטור DISTINCT ל-SQL שנוצר.

בחירת שפה

כברירת מחדל, חיפוש הטקסט המלא מנתח מסמכים באנגלית. אפשר לשנות את זה באמצעות ארגומנט השפה בהוראת @searchable:

type Movie
  @table {
  title: String! @searchable(language: "french")
  ...
}

ציון השפה הנכונה יאפשר ל-PostgreSQL לבצע ניתוח מורפולוגי מדויק של מילים, ויעזור לוודא שהחיפוש לא יפספס תוצאות רלוונטיות. אם מחפשים בכמה עמודות, צריך להגדיר את אותה שפה לכל העמודות.

שפות
  • פשוט
  • arabic
  • ארמנית
  • בסקית
  • קטלאנית
  • דנית
  • dutch
  • english
  • פינית
  • french
  • german
  • greek
  • הינדית
  • הונגרית
  • indonesian
  • irish
  • איטלקית
  • ליטאית
  • נפאלית
  • norwegian

כדי לקבל את הרשימה המלאה באמצעות psql, אפשר להשתמש בשאילתה הבאה.

SELECT cfgname FROM pg_ts_config;

פורמט השאילתה

כברירת מחדל, חיפוש טקסט מלא משתמש בסמנטיקה של האינטרנט לשאילתות (בדומה לחיפוש Google). אפשר לשנות את ההתנהגות הזו באמצעות הארגומנט queryFormat בשדה <pluralType>_search.

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query, queryFormat: PHRASE) {
    ...
  }
}

יש ארבע אפשרויות לפורמט של שאילתות:

  • QUERY מספק סמנטיקה מוכרת למנועי חיפוש באינטרנט (למשל מחרוזות במירכאות, AND ו-OR). זוהי ברירת המחדל.
  • PLAIN מתאים לכל המילים, אבל לא בהכרח יחד (למשל, 'כלב חום' יתאים ל'הכלב החום והלבן' או ל'הכלב הלבן והחום').
  • PHRASE מתאים לביטוי מדויק (למשל, "brown dog" יתאים ל-"the white and brown dog", אבל לא ל-"brown and white dog").
  • מתקדם מאפשר ליצור שאילתות מורכבות באמצעות הסט המלא של אופרטורים של tsquery.

סף הרלוונטיות

הגדרת סף רלוונטיות פירושה שהחיפוש יחזיר רק תוצאות שערך הרלוונטיות שלהן גבוה מערך מסוים. במקרים רבים לא צריך להגדיר את זה – כל תוצאה עם רלוונטיות גדולה מ-0 תהיה תוצאה רלוונטית.

עם זאת, אם אתם מגלים שהחיפוש מחזיר תוצאות שלא נראות לכם רלוונטיות, תוכלו להשתמש בסף הרלוונטיות כדי לסנן אותן.

כדי להבין מהו ערך מתאים לסף הרלוונטיות, כדאי לבצע כמה חיפושי בדיקה ולעיין ב_metadata.relevance:

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query) {
    id
    title
    _metadata {
      relevance
    }
    ...
  }
}

בוחרים סף שיוביל להשמטת תוצאות שלדעתכם לא רלוונטיות. כדי לעשות את זה:

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query, relevanceThreshold: 0.05) {
    id
    title
    ...
  }
}

בחירה בין חיפוש טקסט מלא, חיפוש דמיון וקטורי ומסנני תבניות מחרוזות

Data Connect מציע כמה דרכים שונות לחיפוש במסד הנתונים.

הטבלה הבאה יכולה לעזור לכם לבחור את השיטה המתאימה לתרחיש השימוש שלכם.

חיפוש טקסט מלא חיפוש דמיון וקטורי מסננים של תבניות מחרוזות
מתאים להטמעה של פונקציונליות חיפוש כללית מתאים למציאת שורות דומות מבחינה סמנטית (לדוגמה, המלצות או 'עוד תוצאות דומות') מתאים להתאמות מדויקות של טקסט או לחיפושים של ביטויים רגולריים
מבצעת גזירה לקסיקלית, שעוזרת להתאים צורות שונות או זמנים שונים של אותה מילה נדרש Vertex AI השימוש בזיכרון ובנפח הדיסק הוא הכי נמוך, כי לא נדרשים אינדקסים או עמודות שנוצרו
אפשר לבצע את הפעולה על כמה עמודות בטבלה אפשר להשתמש בה רק בעמודה אחת בכל פעם אפשר לבצע את הפעולה על כמה עמודות בטבלה באמצעות מסנני OR
ביצועים טובים במסמכים גדולים יותר ביצועים טובים במסמכים גדולים הביצועים פחות טובים כשמחפשים במסמכים גדולים יותר
מוסיף תקורה של זיכרון ואחסון כדי לאחסן עמודה שנוצרה ואינדקס לכל חיפוש