2017-03-28 1 views
0

Ich kann eine bestimmte Volltextsuche in MongoDB nicht herausfinden. Ich kann in der MongoDB-Dokumentation keine Möglichkeit finden, mindestens einen Begriff aus einer Liste zu erzwingen, wie ich es bei + in MySQL anmelden kann. Zum Beispiel kann ich in MySQL nicht definieren: "+green +(red blue)", die alle Zeilen auswählen, die "green" AND ("red" OR "blue") in einigen der indizierten Spalten enthalten. Beachten Sie, dass eine Zeile, die nur green enthält, nicht ausgewählt wird. Es gibt ein "ähnliches" Verhalten in MongoDB, aber es funktioniert nicht so, wie ich es brauche. Lassen Sie mich zitieren die official documentation example:Wie erzwinge mindestens einen Begriff aus einer Liste in einer Volltextsuche in MongoDB

For example, passed a $search string: 

"\"ssl certificate\" authority key" 
The $text operator searches for the phrase "ssl certificate" and ("authority" or "key" or "ssl" or "certificate") 

Also habe ich die Sammlung Palette zum Beweis des Konzepts:

db.palette.insertMany([ 
    {colors: "green,black"}, 
    {colors: "green,red"}, 
    {colors: "green,blue"} 
]) 

Dann habe ich einen Textindex:

db.palette.createIndex({colors: "text"}) 

Beachten Sie, dass MongoDB Zuerst werden die String-Werte intern durch das Komma geteilt, um Wörter zu indexieren. Ich habe das sogar mit db.palette.validate() inf überprüft Ormation. Schließlich habe ich versucht, mit der folgenden Zeichenfolge suchen:

db.palette.find({$text: {$search: "\"green\" red blue"}}) 

ich nur zweites und drittes Dokument, sondern das Ergebnis enthält den ersten zu ("green,black") abrufen muß. Ich schätze, es liegt an der MongoDB-Regel, die oben beschrieben wurde: "green" AND ("red" OR "blue" OR "green"), also ist die letzte Bedingung immer true. Nur um ein anderes Schema zu testen, habe ich das colors Feld in color1 und color2 aufgeteilt und dann einen zusammengesetzten Textindex erstellt, aber das Ergebnis war das gleiche.

also: Gibt es einen Weg in MongoDB, um die Abfrage zu machen, die ich brauche?

Antwort

0

Schließlich schrieb ich an MongoDB Jungs. Die Antwort von ihnen:

Diese Feature-Anforderung wird in SERVER-22583 verfolgt. Bitte zögern Sie nicht, dafür abzustimmen und auf Updates zu achten.

So gibt es derzeit keine Möglichkeit, zu tun, was ich brauche :(

0

Sie können Regex-Funktionalität für diese Abfrage verwenden. Zum Beispiel:

db.palette.find({colors:{$in:[/green.*red/,/green.*blue/]}}) 

docs: https://docs.mongodb.com/manual/reference/operator/query/regex/

+0

Dank @Moi aber ich bin erzwungen nur das Problem mit Volltextsuche zu lösen. Das eigentliche Problem ist ein Textsuche über mehr als 40 Felder Also habe ich das Problem einfach reduziert, indem ich einfach ein einfaches Beispiel mit Farben verwendete. – Delmo

Verwandte Themen