Utilisez les fonctionnalités de recherche textuelle dans Cloud Firestore pour rechercher des chaînes spécifiques dans une collection.
Avant de commencer
Avant de commencer à utiliser les recherches textuelles, procédez comme suit :
Assurez-vous d'avoir accès à une base de données d'opérations compatible avec MongoDB existante ou créez-en une et connectez-vous à celle-ci.
Assurez-vous d'avoir un index textuel ou créez-en un.
Effectuer une recherche textuelle
Les recherches textuelles utilisent l'opérateur $text dans un filtre.
Spécifiez la chaîne interrogée dans l'argument $search.
Effectuer une recherche textuelle générale
Exécutez la commande suivante pour effectuer une recherche textuelle 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é "and" dans votre recherche.
Par exemple, si vous aviez une partition city, vous pouvez 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 partition doit être joint à 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 textuel.
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 textuelle plus précise, spécifiez une chaîne de termes. Par exemple, la recherche suivante renvoie les documents qui correspondent à 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, faites-le précéder d'un trait d'union (-) :
# 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 de
s documents correspondant à la recherche textuelle. Pour trier les résultats par ordre décroissant, 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"} } },
]);
Développer la recherche
Pour améliorer la pertinence des résultats de recherche textuelle, 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 contextuels, les formes dérivées, les termes corrigés orthographiquement, les variantes diacritiques, etc.
Limites
- Les opérateurs
$nearet$textne peuvent pas être utilisés dans la même recherche textuelle. - Un seul opérateur
$textest autorisé par recherchefindouaggregation. - Dans les agrégations, l'étape
$matchavec$textdoit être la première étape du pipeline. $textne peut être imbriqué que dans$andet$or.- Si
$textse 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. $textne peut pas être utilisé avec des indications.- Les requêtes avec recherche textuelle ne peuvent pas être triées par
$natural.