mongoDB préfixe générique: fulltext-la recherche ($texte) trouver une partie avec des chaînes de recherche
J'ai mongodb avec un $text-Index
et comme cela:
{
foo: "my super cool item"
}
{
foo: "your not so cool item"
}
Si je fais une recherche avec
mycoll.find({ $text: { $search: "super"} })
- je obtenir le premier élément (correct).
Mais je veux également rechercher avec "uper" pour obtenir le poing de l'élément, mais si je tente:
mycoll.find({ $text: { $search: "uper"} })
Je n'obtiens aucun résultat.
Ma Question:
Si il y a un moyen d'utiliser $texte de sorte que son trouve des résultats avec une partie de la recherche de chaîne de caractères? (par exemple, comme '%uper%'
dans mysql
)
Attention: je ne pas demander un regex seulement de la recherche - je demander une regex de recherche au sein d'un $recherche de texte!
- Vérifiez ceci : stackoverflow.com/questions/3305561/...
Vous devez vous connecter pour publier un commentaire.
Il n'est pas possible de le faire avec
$text
opérateur.Index de texte sont créés avec les termes inclus dans la chaîne de valeur, ou une des chaînes de tableau et de la recherche dans ces idexes.
Vous ne pouvez grouper des termes sur une pharse mais ne pas prendre une partie d'entre eux.
Lire
$texte
opérateur de référence et les index de texte description.explain()
méthode.$text
opérateur? @MarkusWMahlberg je confirme la réponse de @francadaval. Vous pouvez utiliser des regex pour rechercher la reconnaissance partielle, mais la performance n'est pas bonne, même avec un indice qui empêche COLLSCAN. 🙁$text
.Ce que vous essayez de faire dans votre second exemple est le préfixe de recherche de génériques dans votre collection
mycoll
sur le terrainfoo
. Ce n'est pas quelque chose de la textsearch fonction est conçue pour les et il n'est pas possible de le faire avec$text
de l'opérateur. Ce comportement ne comprennent pas le générique préfixe de recherche sur le jeton dans le champ indexé. Cependant, vous pouvez également effectuer des regex de recherche comme d'autres l'ont suggéré. Voici ma procédure pas à pas:La
$text
opérateur prend en charge la recherche d'un seul mot, recherche pour l'un ou plusieurs mots ou de recherche de phrase. Le type de recherche que vous désirez n'est pas pris en chargeLa regex solution:
La réponse à votre dernière question: pour faire mysql style
%super%
dans mongoDB, vous serait le plus susceptible d'avoir à faire:$text
vous pouvez rechercher un mot, une liste de mots ou de phrases. J'ai mis à jour la réponse ainsi.Je n'ai pas assez de réputation pour commentaire jasenkoh solution, mais c'est clairement la meilleure façon de faire face à cette situation.
À l'OP situation, je voudrais:
Pour de meilleures performances (mais des résultats légèrement différents), remplacer la dernière ligne avec:
Il devrait travailler avec les
/uper/
.Voir http://docs.mongodb.org/manual/reference/operator/query/regex/ pour plus de détails.
Edit:
Conformément à la demande dans les commentaires:
La solution n'est pas nécessairement destiné à donner à ce que l'OP demandé, mais ce qu'il faut pour résoudre le problème.
Depuis
$regex
recherches ne fonctionnent pas avec le texte des indices, une simple regex de recherche sur un champ indexé doit donner l'attend résultat, mais pas à l'aide de l'demandé signifie.En fait, il est assez facile de le faire:
nous donne le résultat attendu:
Ajoutée expliquer nous montre que l'indice a été utilisé de manière efficace:
Pour faire une longue histoire courte: Non, vous ne pouvez pas réutiliser un
$text
indice, mais vous pouvez faire la requête de manière efficace. Comme écrit dans Implémenter la fonctionnalité d'auto-complétion à l'aide de MongoDB recherche , on pourrait probablement être encore plus efficace en utilisant une carte/réduire approche, éliminant la redondance inutile et arrêter de mots à partir d'indices, au prix d'être pas en temps réel plus.$regex
de l'opérateur, ce qui n'est pas ce que l'OP a demandé à propos. Il semble que le$text
opérateur ne prend pas en charge les caractères génériques.explain('executionStats')
et de trouver par vous-même... ou tout simplement regarder l'indice de limites pour votre réponse. Cet indice est efficace uniquement si vous effectuez une requête pour un préfixe.{foo: "text", bar: "text"}
et souhaitez rechercher dans les deux, vous devez utiliser.find({$text: {$search: query}})
et puis, votre réponse ne fonctionne pas.Comme francadaval dit, l'index de texte est à la recherche par termes, mais si vous combinez
regex
ettext-index
vous devriez être bon.Aussi, assurez-vous que vous avez indice normal appliqué à la colonne autre que l'index de texte.
No query solutions
.}
manquant avant]
. 2. A échoué à produire une solution pour le TEXTE OU sous-autres non-TEXTE des clauses en vertu OU à être indexé ainsisuper cool
si vous allez avec les regex, vous pouvez réaliser de la recherche pour "super cool", mais pas "super article", afin d'obtenir une demande de faire une demande avec $texte et $regex pour le terme de recherche.
assurez-vous de l'indice à la fois le texte de l'indexation et de l'indexation normale de travail.
Vous pourriez avoir atteint est
Ici " je " est une option, dénote de la casse de la recherche