2016-08-17 10 views
3

Ich versuche, alle Wörter in einem Suchstring über mehrere Felder zu finden. Zum Beispiel:MongoDB - finde alle Suchbegriffe in mehreren Feldern

Wenn ich „java Kaffee“ in diesen Daten suchen war:

{ _id: 1, name: "Java Hut", description: "Coffee and cakes" }, 
{ _id: 2, name: "Burger Buns", description: "Gourmet hamburgers" }, 
{ _id: 3, name: "Coffee Shop", description: "Just coffee" }, 
{ _id: 4, name: "Clothes Clothes Clothes", description: "Discount clothing" }, 
{ _id: 5, name: "Java Shopping", description: "Indonesian goods Hut" }, 
{ _id: 6, name: "Java Coffee", description: "goods Hut" }, 
{ _id: 7, name: "Coffee Shop", description: "Just coffee Java" } 

ich mag es für jedes Wort einzeln in jedem Feld und kehrt alle Dokumente, die jeden hatten suchen Suchwort in einem bestimmten Feld.

Ich soll ids erhalten 1, 6 und 7 zurück Ergebnisse aufgrund dieser Begegnungen:

{ _id: 1, name: "**Java** Hut", description: "**Coffee** and cakes" },<br> 
{ _id: 2, name: "Burger Buns", description: "Gourmet hamburgers" },<br> 
{ _id: 3, name: "Coffee Shop", description: "Just coffee" },<br> 
{ _id: 4, name: "Clothes Clothes Clothes", description: "Discount clothing" },<br> 
{ _id: 5, name: "Java Shopping", description: "Indonesian goods Hut" },<br> 
{ _id: 6, name: "**Java Coffee**", description: "goods Hut" },<br> 
{ _id: 7, name: "Coffee Shop", description: "Just **coffee Java**" } 

Alle Ideen, wie ich dies in einer effizienten Art und Weise erreichen kann für Mongo es auszuführen?

Antwort

2

Sie können Ihrer Sammlung eine hinzufügen, um die Textsuche über mehrere Felder zu ermöglichen. In diesem Fall:

db.test.createIndex({name: 'text', description: 'text'}) 

, dann docs zu finden, die sowohl „java“ enthalten und „Kaffee“ in jedem Bereich können Sie eine text search Abfrage mit den beiden Worten ausführen zitiert zu verlangen, dass gefunden werden beide Wörter. Zitiert man die Wörter, verwandelt man sie in phrases, was statt OR logisches UND-Verhalten aufruft.

db.test.find({$text: {$search: '"java" "coffee"'}}) 
+0

Danke, das hat für mich funktioniert. Es funktioniert sogar, wenn eines der Wörter ein Teil ist, wie "jav" statt "java". Weißt du, ob es einen Weg gibt, es für mehrere Teilwörter funktionieren zu lassen? – Kendall

+0

Ich würde nicht erwarten, dass Teilwörter bei einer Textsuche zuverlässig funktionieren, da es Wortstamming und nicht Teilabgleich verwendet. – JohnnyHK

0

Wenn die Suchzeichenfolge eine durch Leerzeichen getrennte Zeichenfolge ist, führt der Operator $ text eine logische ODER-Suche für jeden Begriff durch und gibt Dokumente zurück, die einen der Begriffe enthalten.

db.collection.find({ $text: { $search: "java coffee" } }) 

Die Abfrage gibt entweder Kaffee oder Java ist in allen Dokumenten dieser Sammlung vorhanden.

Weitere Informationen finden Sie unter manual.

Verwandte Themen