MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongodb daran hindern, Sonderzeichen zu ignorieren?

Tomalaks Beschreibung, wie die Textindizierung funktioniert, ist korrekt, aber Sie können tatsächlich einen Textindex für eine exakte Phrasenübereinstimmung mit einer Phrase mit einem Sonderzeichen verwenden:

> db.test.drop()
> db.test.insert({ "_id" : 0, "t" : "hey look at all this #text" })
> db.test.insert({ "_id" : 1, "t" : "text is the best" })
> db.test.ensureIndex({ "t" : "text" })

> db.test.count({ "$text" : { "$search" : "text" } })
2
> db.test.count({ "$text" : { "$search" : "#text" } })
2

> db.test.find({ "$text" : { "$search" : "\"#text\"" } })
{ "_id" : 0, "t" : "hey look at all this #text" }

Genaue Übereinstimmungen von Ausdrücken werden durch das Einschließen des Ausdrucks in doppelte Anführungszeichen angezeigt, die in der Shell wie "\"#text\"" maskiert werden müssen .

Textindizes sind größer als normale Indizes, aber wenn Sie viele exakte Wortgruppenübereinstimmungen ohne Berücksichtigung der Groß-/Kleinschreibung durchführen, können sie eine bessere Option sein als ein Standardindex, da sie eine bessere Leistung erbringen. Zum Beispiel auf einem Feld t mit einem Index { "t" : 1 } , ein exakt passender regulärer Ausdruck

> db.test.find({ "t" : /#text/ })

führt einen vollständigen Index-Scan durch. Die analoge (aber nicht äquivalente) Textabfrage

> db.test.find({ "$text" : { "$search" : "\"#text\"" } })

verwendet den Textindex, um Dokumente zu finden, die den Begriff "text" enthalten , und scannen Sie dann alle diese Dokumente, um festzustellen, ob sie den vollständigen Ausdruck "#text enthalten ".

Seien Sie vorsichtig, da bei Textindizes die Groß-/Kleinschreibung nicht beachtet wird. Fortsetzung des obigen Beispiels:

> db.test.insert({ "_id" : 2, "t" : "Never seen so much #TEXT" })

> db.test.find({ "t" : /#text/ })
{ "_id" : 0, "t" : "hey look at all this #text" }

> db.test.find({ "$text" : { "$search" : "\"#text\"" } })
{ "_id" : 0, "t" : "hey look at all this #text" }
{ "_id" : 2, "t" : "Never seen so much #TEXT" }