Utiliser des recherches textuelles

Utilisez les fonctionnalités de recherche de texte dans Firestore avec compatibilité MongoDB pour rechercher des chaînes spécifiques dans une collection.

Avant de commencer

Avant de commencer à utiliser les recherches textuelles, procédez comme suit :

  1. Assurez-vous d'avoir accès à une base de données d'opérations compatible avec MongoDB ou créez-en une et connectez-vous à celle-ci.

  2. Assurez-vous d'avoir un index textuel ou créez-en un.

Les recherches textuelles utilisent l'opérateur $text à l'intérieur d'un filtre. Spécifiez la chaîne interrogée dans l'argument $search.

Exécutez la commande suivante pour effectuer une recherche de texte générale :

  # Find search
  db.cities.find({ $text: { $search: "french bread" } })

  # Aggregation search
  db.cities.aggregate([
    { $match: { $text: { $search: "french bread" } } }
  ]);

Si votre index est partitionné, vous pouvez filtrer en fonction de la partition en l'incluant dans un filtre d'égalité "et" dans votre recherche. Par exemple, si vous aviez une partition city, vous pourriez filtrer une recherche textuelle comme suit :

db.myCollection.find( { $and: [
  { $text: { $search: "french bread" } },
  { "city": "Paris" }
] } )

Vous pouvez également filtrer une agrégation en fonction d'une partition. Exemple :

db.myCollection.aggregate([
 { $match: { $text: { $search: "french bread" } } },
 { "city": "Paris" }
] );

La valeur de votre partition doit être une chaîne. Votre filtre de partitionnement doit être associé à votre recherche textuelle à l'aide d'un "and".

Définir la langue de la recherche textuelle

Vous pouvez définir la langue de la recherche textuelle à l'aide de l'argument $language. Exemple :

  db.cities.find({ $text: { $search: "french bread", $language: "en"} })

Si vous ne définissez pas de langue, la recherche utilise la langue de l'index de texte.

Rechercher un terme exact

Pour rechercher un terme exact, configurez-le comme une séquence de mots entre guillemets doubles. Exemple :

  # Find search
  db.cities.find({ $text: { $search: "\"best french bread\"" } })

  # Aggregation search
  db.cities.aggregate([
    { $match: { $text: { $search: "\"best french bread\"" } } },
  ]);

Rechercher une combinaison de termes

Pour rendre votre recherche de texte plus précise, spécifiez une chaîne de termes. Par exemple, la recherche suivante renvoie les documents correspondant à la combinaison 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" } } },
  ]);

Exclure un terme

Pour exclure un terme d'une recherche textuelle, ajoutez un trait d'union (-) devant le terme :

  # Find search
  db.cities.find({ $text: { $search: "best bread -french"} })

  # Aggregation search
  db.cities.aggregate([
    { $match: { $text: { $search: "best bread -french" } } },
  ]);

Calculer le score de pertinence

Utilisez l'expression {$meta: "textScore"} pour calculer le score de pertinence des documents correspondant à la recherche textuelle. Pour trier les résultats par ordre décroissant de score, utilisez $meta dans une expression de tri. Prenons les exemples suivants, où SCORE_FIELD est le nom du champ utilisé pour stocker la valeur du score :

  # 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"} } },
  ]);

Vous pouvez également utiliser le score de texte dans les expressions de projection. Exemple :

  # 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"} } },
  ]);

Pour améliorer la pertinence des résultats de recherche de texte, l'opérateur $text augmente la chaîne de recherche en fonction de la langue spécifiée afin d'inclure les correspondances pour les synonymes tenant compte du contexte, les formes fléchies, les termes corrigés orthographiquement, les variantes diacritiques et plus encore.

Limites

  • Vous ne pouvez pas utiliser les opérateurs $near et $text dans la même recherche textuelle.
  • Un seul opérateur $text est autorisé par recherche find ou aggregation.
  • Dans les agrégations, l'étape $match avec $text doit être la première étape du pipeline.
  • $text ne peut être imbriqué que dans $and et $or.
  • Si $text se trouve dans $or, les disjonctions non liées à la recherche peuvent utiliser des index ordonnés existants pour optimiser la recherche. Si les autres disjonctions ne sont pas indexées, la recherche s'appuie sur une analyse de la collection.
  • $text ne peut pas être utilisé avec des indications.
  • Les requêtes avec recherche de texte ne peuvent pas être triées par $natural.