MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Une recherche $text peut-elle effectuer une correspondance partielle

MongoDB $text les recherches ne prennent pas en charge la correspondance partielle. MongoDB permet les requêtes de recherche de texte sur le contenu des chaînes avec prise en charge de l'insensibilité à la casse, des délimiteurs, des mots vides et de la radicalisation. Et les termes de votre chaîne de recherche sont, par défaut, OR.

En prenant vos exemples (très utiles :) un par un :

DURÉE UNIQUE, PARTIELLE

// returns nothing because there is no world word with the value `Crai` in your
// text index and there is no whole word for which `Crai` is a recognised stem
db.submissions.find({"$text":{"$search":"\"Crai\""}})

TERMES MULTIPLES, COMPLETS

// returns the document because it contains all of these words
// note in the text index Dr. Bob is not a single entry since "." is a delimiter
db.submissions.find({"$text":{"$search":"\"Craig\" \"Dr. Bob\""}})

PLUSIEURS CONDITIONS, UNE PARTIELLE

// returns the document because it contains the whole word "Craig" and it 
// contains the whole word "Dr" 
db.submissions.find({"$text":{"$search":"\"Craig\" \"Dr. Bo\""}})

PLUSIEURS TERMES, LES DEUX PARTIELS

// returns the document because it contains the whole word "Dr"
db.submissions.find({"$text":{"$search":"\"Crai\" \"Dr. Bo\""}})

Gardez à l'esprit que le $search la chaîne est ...

Donc, si au moins un terme dans votre $search chaîne correspond alors MongoDB correspond à ce document.

Pour vérifier ce comportement, si vous éditez votre document en changeant Dr. Bob à DrBob alors les requêtes suivantes renverront non documents :

db.submissions.find({"$text":{"$search":"\"Craig\" \"Dr. Bo\""}})
db.submissions.find({"$text":{"$search":"\"Crai\" \"Dr. Bo\""}})

Celles-ci ne renvoient désormais aucune correspondance car Dr n'est plus un mot entier dans votre index de texte car il n'est pas suivi du . délimiteur.