2015-07-27 4 views
6

Rückkehr So nach MongoDB docs,MongoDB Vollwortsuche mit genauer Begriff nicht die erwarteten Ergebnisse

, wenn ein Dokument Feld das Wort Heidelbeere enthält, eine Suche auf dem Begriff blau wird das Dokument nicht überein

Das ist gut für meinen Anwendungsfall, es ist, was ich auftreten möchte. Doch die folgende DB Einträge gegeben:

> db.test.drop() 
> db.test.insert({ "t" : "Men's Fashion" }) 
> db.test.insert({ "t" : "Women's Fashion" }) 
> db.test.ensureIndex({ "t" : "text" }) 

Eine Suche nach Männern kehren die erwarteten Ergebnisse:

> db.test.find({ "$text" : { "$search" : "\"Men's\"" } }, { "_id" : 0 }) 
{ "t" : "Men's Fashion" } 

jedoch eine Suche nach der ganzen Satz Herrenmode, unerwartet kehrt auch Damenmode:

> db.test.find({ "$text" : { "$search" : "\"Men's Fashion\"" } }, { "_id" : 0 }) 
{ "t" : "Women's Fashion" } 
{ "t" : "Men's Fashion" } 

Ich habe versucht "\"Men's\"\"Fashion\"" auch mit den gleichen Ergebnissen. Gibt es einen Workaround/Trick, um die vollständige Phrase zu erhalten, um nur vollständige Wortübereinstimmungen zurückzugeben?

Ich benutze Mongo 2.6.4. Interessanterweise erzielt es Frauen niedriger als Männer.

+1

Gute Frage. Ich sehe das gleiche merkwürdige Verhalten mit Mongo 3.0.4. – JohnnyHK

+0

Weil Frauen Mode passt Männermode ... –

Antwort

2

Die Ergebnisse, die Sie sehen sind, weil Damenmode Herrenmode in dem Sinne übereinstimmt, dass die String-Suche in der Zeichenfolge gesucht werden soll.

Das Spiel Verhalten tritt nicht mit diesem Datensatz:

/* 1 */ 
{ 
    "_id" : ObjectId("55ca6060fb286267994d297e"), 
    "text" : "potato pancake" 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("55ca6075fb286267994d297f"), 
    "text" : "potato salad" 
} 

/* 3 */ 
{ 
    "_id" : ObjectId("55ca612ffb286267994d2980"), 
    "text" : "potato's pancake" 
} 

mit der Abfrage

db.getCollection('rudy_test').find({$text : {"$search" : "\"potato pancake\""}}) 

Es durch die Tatsache verursacht wird, dass der Eintrag die gesamte Abfrage enthält, wird die Partitur nur niedriger weil es auch anderen Text enthält. Sie könnten stattdessen einen Regular Expression Query (d. H. db.test.find({t : {$regex : /^Men\'s Fashion$/}})) verwenden.

+0

Jason ist genau richtig. Frage gestellt auch in https://jira.mongodb.org/browse/SERVER-20307 –

+0

Ja, es enthält die Zeichenfolge, aber es sollte aus den Ergebnissen ausgeschlossen werden, weil es kein ganzes Wort entspricht. Entweder das, oder die Suche nach "\" Herren \ "sollte auch woMEN zurückgeben - aber das tut es nicht. Im Wesentlichen ist es inkonsistentes Verhalten, abhängig von der Anzahl der Wörter in der Phrase, und von dem, was ich von Dans Antwort im Bug-Bericht verstehe, ist es in der Tat ein Bug, der behoben werden soll. – JBY

+0

Auch Regex ist leider keine geeignete Problemumgehung, da Sie die Vorteile der Textsuche verlieren (Stemming, Scoring und Geschwindigkeit am wichtigsten). – JBY

Verwandte Themen