Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Effectuer une recherche de texte avec Amazon DocumentDB
La fonction de recherche en texte intégral native d'Amazon DocumentDB (Text Index v1) vous permet d'effectuer une recherche de texte sur de grands ensembles de données textuelles à l'aide d'index de texte spécifiques. Cette section décrit les fonctionnalités de la fonctionnalité d'index de texte et explique comment créer et utiliser des index de texte dans Amazon DocumentDB. Les limites de recherche de texte sont également répertoriées.
Rubriques
Fonctionnalités prises en charge
La recherche de texte Amazon DocumentDB prend en charge les fonctionnalités compatibles avec l'API MongoDB suivantes :
Créez des index de texte sur un seul champ.
Créez des index de texte composés qui incluent plusieurs champs de texte.
Effectuez des recherches avec un ou plusieurs mots.
Contrôlez les résultats de recherche à l'aide de poids.
Triez les résultats de recherche par score.
Utilisez l'index de texte dans le pipeline d'agrégation.
Recherchez la phrase exacte.
Utilisation de l'index de texte Amazon DocumentDB
Pour créer un index de texte sur un champ contenant des données de chaîne, spécifiez la chaîne « texte » comme indiqué ci-dessous :
Index à champ unique :
db.test.createIndex({"comments": "text"})
Cet index prend en charge les requêtes de recherche de texte dans le champ de chaîne « commentaires » de la collection spécifiée.
Créez un index de texte composé sur plusieurs champs de chaîne :
db.test.createIndex({"comments": "text", "title":"text"})
Cet index prend en charge les requêtes de recherche de texte dans les champs de chaîne « commentaires » et « titre » de la collection spécifiée. Vous pouvez spécifier jusqu'à 30 champs lors de la création d'un index de texte composé. Une fois créées, vos requêtes de recherche textuelle interrogeront tous les champs indexés.
Note
Un seul index de texte est autorisé par collection.
Répertorier un index de texte dans une collection Amazon DocumentDB
Vous pouvez l'utiliser getIndexes() sur votre collection pour identifier et décrire les index, y compris les index de texte, comme illustré dans l'exemple suivant :
rs0:PRIMARY> db.test.getIndexes() [ { "v" : 4, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.test" }, { "v" : 1, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "contents_text", "ns" : "test.test", "default_language" : "english", "weights" : { "comments" : 1 }, "textIndexVersion" : 1 } ]
Une fois que vous avez créé un index, commencez à insérer des données dans votre collection Amazon DocumentDB.
db.test.insertMany([{"_id": 1, "star_rating": 4, "comments": "apple is red"}, {"_id": 2, "star_rating": 5, "comments": "pie is delicious"}, {"_id": 3, "star_rating": 3, "comments": "apples, oranges - healthy fruit"}, {"_id": 4, "star_rating": 2, "comments": "bake the apple pie in the oven"}, {"_id": 5, "star_rating": 5, "comments": "interesting couch"}, {"_id": 6, "star_rating": 5, "comments": "interested in couch for sale, year 2022"}])
Exécution de requêtes de recherche textuelle
Exécuter une requête de recherche textuelle contenant un seul mot
Vous devrez utiliser les $search opérateurs $text et pour effectuer des recherches textuelles. L'exemple suivant renvoie tous les documents dans lesquels votre champ de texte indexé contient la chaîne « pomme » ou « pomme » dans d'autres formats tels que « pommes » :
db.test.find({$text: {$search: "apple"}})
Sortie :
Le résultat de cette commande ressemble à ceci :
{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red" }
{ "_id" : 3, "star_rating" : 3, "comments" : "apples, oranges - healthy fruit" }
{ "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" }
Lancer une recherche textuelle comportant plusieurs mots
Vous pouvez également effectuer des recherches textuelles comportant plusieurs mots dans vos données Amazon DocumentDB. La commande ci-dessous renvoie des documents contenant un champ indexé contenant « pomme » ou « tarte » :
db.test.find({$text: {$search: "apple pie"}})
Sortie :
Le résultat de cette commande ressemble à ceci :
{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red" }
{ "_id" : 2, "star_rating" : 5, "comments" : "pie is delicious" }
{ "_id" : 3, "star_rating" : 3, "comments" : "apples, oranges - healthy fruit" }
{ "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" }
Lancer une recherche textuelle comportant plusieurs mots
Pour une recherche de phrases comportant plusieurs mots, utilisez cet exemple :
db.test.find({$text: {$search: "\"apple pie\""}})
Sortie :
La commande ci-dessus renvoie des documents dont le champ textuel indexé contient l'expression exacte « tarte aux pommes ». Le résultat de cette commande ressemble à ceci :
{ "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" }
Lancer une recherche textuelle avec des filtres
Vous pouvez également combiner la recherche textuelle avec d'autres opérateurs de requête pour filtrer les résultats en fonction de critères supplémentaires :
db.test.find({$and: [{star_rating: 5}, {$text: {$search: "interest"}}]})
Sortie :
La commande ci-dessus renvoie des documents contenant un champ de texte indexé contenant n'importe quelle forme d' « intérêt » et un « star_rating » égal à 5. Le résultat de cette commande ressemble à ceci :
{ "_id" : 5, "star_rating" : 5, "comments" : "interesting couch" }
{ "_id" : 6, "star_rating" : 5, "comments" : "interested in couch for sale, year 2022" }
Limiter le nombre de documents renvoyés lors d'une recherche textuelle
Vous pouvez choisir de limiter le nombre de documents renvoyés en utilisant limit :
db.test.find({$and: [{star_rating: 5}, {$text: {$search: "couch"}}]}).limit(1)
Sortie :
La commande ci-dessus renvoie un résultat qui satisfait le filtre :
{ "_id" : 5, "star_rating" : 5, "comments" : "interesting couch" }
Trier les résultats par score textuel
L'exemple suivant trie les résultats de la recherche de texte par score de texte :
db.test.find({$text: {$search: "apple"}}, {score: {$meta: "textScore"}}).sort({score: {$meta: "textScore"}})
Sortie :
La commande ci-dessus renvoie les documents contenant un champ indexé contenant « pomme », ou « pomme » dans d'autres formats tels que « pommes », et trie le résultat en fonction de la pertinence du document par rapport au terme de recherche. Le résultat de cette commande ressemble à ceci :
{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red", "score" : 0.6079270860936958 }
{ "_id" : 3, "star_rating" : 3, "comments" : "apples, oranges - healthy fruit", "score" : 0.6079270860936958 }
{ "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven", "score" : 0.6079270860936958 }
$textet $search sont également pris en charge pour les delete commandes aggregate count findAndModifyupdate,, et.
Opérateurs d'agrégation
Pipeline d'agrégation utilisant $match
db.test.aggregate( [{ $match: { $text: { $search: "apple pie" } } }] )
Sortie :
La commande ci-dessus renvoie les résultats suivants :
{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red" }
{ "_id" : 3, "star_rating" : 3, "comments" : "apples, oranges - healthy fruit" }
{ "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" }
{ "_id" : 2, "star_rating" : 5, "comments" : "pie is delicious" }
Combinaison d'autres opérateurs d'agrégation
db.test.aggregate( [ { $match: { $text: { $search: "apple pie" } } }, { $sort: { score: { $meta: "textScore" } } }, { $project: { score: { $meta: "textScore" } } } ] )
Sortie :
La commande ci-dessus renvoie les résultats suivants :
{ "_id" : 4, "score" : 0.6079270860936958 }
{ "_id" : 1, "score" : 0.3039635430468479 }
{ "_id" : 2, "score" : 0.3039635430468479 }
{ "_id" : 3, "score" : 0.3039635430468479 }
Spécifiez plusieurs champs lors de la création d'un index de texte
Vous pouvez attribuer des pondérations à un maximum de trois champs de votre index de texte composé. Le poids par défaut attribué à un champ dans un index de texte est de un (1). Le poids est un paramètre facultatif et doit être compris entre 1 et 100 000.
db.test.createIndex( { "firstname": "text", "lastname": "text", ... }, { weights: { "firstname": 5, "lastname":10, ... }, name: "name_text_index" } )
Différences avec MongoDB
La fonctionnalité d'index de texte d'Amazon DocumentDB utilise un index inversé avec un algorithme de fréquence terminologique. Les index de texte sont clairsemés par défaut. En raison de différences dans la logique d'analyse, les délimiteurs de tokenisation et autres, le même jeu de résultats que MongoDB peut ne pas être renvoyé pour le même ensemble de données ou la même forme de requête.
Les différences supplémentaires suivantes existent entre l'index de texte Amazon DocumentDB et MongoDB :
Les index composés utilisant des index non textuels ne sont pas pris en charge.
Les index de texte Amazon DocumentDB ne font pas la distinction entre majuscules et minuscules.
Seule la langue anglaise est prise en charge avec l'index de texte.
L'indexation de texte des champs de type tableau (ou multiclé) n'est pas prise en charge. Par exemple, la création d'un index de texte sur « a » avec le document {« a » : [« apple », « pie »]} échouera.
L'indexation de texte générique n'est pas prise en charge.
Les index de texte uniques ne sont pas pris en charge.
L'exclusion d'un terme n'est pas prise en charge.
Meilleures pratiques et directives
Pour optimiser les performances des requêtes de recherche de texte impliquant un tri par score de texte, créez l'index de texte avant de charger les données.
Les index de texte nécessitent un espace de stockage supplémentaire pour une copie interne optimisée des données indexées. Cela a des implications financières supplémentaires.
Index de texte V2
Amazon DocumentDB 8.0 introduit une nouvelle version de l'index de texte (V2) qui modifie l'analyseur de recherche de texte sous-jacent afin d'améliorer la compatibilité avec MongoDB.
Outre les fonctionnalités fournies par les index de texte V1, les index de texte V2 fournissent également le support suivant :
Le planificateur déplace les étapes $match plus tôt dans le pipeline lorsque cela est possible, réduisant ainsi le nombre de documents traités par les étapes suivantes.
Amélioration de la tokenisation des caractères spéciaux dans les champs de texte, tels que les e-mails, les URL et les chemins de fichiers. V2 peut analyser et faire correspondre des jetons individuels au sein de ces chaînes, alors que V1 ne le pouvait pas.
rs0:PRIMARY> db.coll.createIndex({ "a": "text" }); rs0:PRIMARY> db.coll.find() { "_id" : 1, "a" : "jane.doe_1234@company.com" } { "_id" : 2, "a" : "janedoe@company.com" } { "_id" : 3, "a" : "/home/user/company/thesis.pdf" } { "_id" : 4, "a" : "/home/user/path/jane.pdf" } { "_id" : 5, "a" : "http://www.company.com/path" } { "_id" : 6, "a" : "https://company.com/path/../home" } // Sample query rs0:PRIMARY> db.coll.find({ $text: { $search: "jane" } }); // V1 text index — no results None // V2 text index — matches tokens within emails and file paths { "_id" : 1, "a" : "jane.doe_1234@company.com" } { "_id" : 4, "a" : "/home/user/path/jane.pdf" }
Limitations
La recherche de texte présente les limites suivantes dans Amazon DocumentDB :
Les index de texte stockent les lexèmes et leurs informations de position. La taille combinée de tous les lexèmes et de leurs informations de position, dans un seul document, est limitée à 1 Mo.