web-dev-qa-db-fra.com

Recherche de texte MongoDB ET plusieurs mots de recherche

J'ai un index sur un tableau "clés" que j'utilise pour fournir une fonctionnalité de texte intégral à mon application.

Avec la version 2.4.3, j'aimerais utiliser le type d'index "text". J'ai assuré un type d'index "texte" sur mon tableau "clés" et il semble fonctionner très rapidement (plus rapide que la méthode de texte intégral de mes anciens mots clés). 

Le problème est que mon application suppose que les champs sont inclusifs (ET). Par défaut, la recherche de texte OU mes paramètres.

Est-ce que quelqu'un connaît un moyen de lancer une recherche de texte inclusivement?

Par exemple:

db.supplies.runCommand("text", {search:"printer ink"})

doit renvoyer les résultats avec l’imprimante et l’encre, au lieu de tous les résultats avec l’imprimante ou l’encre.

34
kmehta

Essayez de:

db.supplies.runCommand("text", {search:"\"printer\" \"ink\""})

En outre, voici une citation de docs :

Si la chaîne de recherche comprend des expressions, la recherche effectue un AND avec tout autre terme dans la chaîne de recherche; par exemple. rechercher "\" scintille scintillement\"petite étoile" recherche "scintillement" et ("petite" ou "étoile").

J'espère que cela pourra aider.

61
alecxe

Vous pouvez envelopper chaque mot entre guillemets:

let keywords = ctx.params.query.split(/\s+/).map(kw => `"${kw}"`).join(' ');
match.$text = { $search: keywords, $caseSensitive: false };

Il y a un inconvénient si l'utilisateur entre une chaîne entre guillemets, cela ne fonctionnera pas. Vous devez d'abord analyser les chaînes citées.

4
chovy

Comme @alecxe l'a souligné précédemment, pour effectuer une recherche ET sur une colonne d'index de texte, vous devez double-citer chaque mot recherché. Ci-dessous, une solution rapide pour votre besoin.

db.supplies.runCommand("text", {search: "printer ink".split(" ").map(str => "\""+str+"\"").join(' ')})
0
Abhay Verma