2011-11-23 17 views
27

Używam wyszukiwania niewrażliwego na wielkość liter w Mongo, coś podobnego do https://stackoverflow.com/q/5500823/1028488.Wyszukiwanie niewrażliwe na wielkość liter w Mongo

tj. Używam wyrażenia regularnego z opcjami i. Ale ja mam problemy ograniczające regex właśnie to słowo, jego Wykonuje się bardziej jak „podobny” w SQL

np: jeśli mogę użyć kwerendy jak {"SearchWord" : { '$regex' : 'win', $options: '-i' }}, to pokazuje mi prowadzi do wygranej, okno & zimie. Jak mogę ograniczyć to do jsut show win?

Próbowałem /^win$/, ale jego sayin nieważny Json .... Proszę zasugerować sposób.

góry dzięki

Odpowiedz

17

UPDATE: Od MongoDB 2.4 można by użyć "tekstowy" indeks i pełne zapytanie tekstowe, aby to zrobić. Możesz o nich przeczytać here. Jeśli korzystasz z najnowszego MongoDB, poniższe podejście byłoby głupie i niepotrzebne.

Jednak jeśli masz MongoDB < 2.4.0 można użyć wyrażenia regularnego tak:

> db.reg.insert({searchword: "win"}) 
> db.reg.insert({searchword: "window"}) 
> db.reg.insert({searchword: "Win"}) 

> db.reg.find() 
{ "_id" : ObjectId("4ecd2e33dd68c9021e453d12"), "searchword" : "win" } 
{ "_id" : ObjectId("4ecd2e36dd68c9021e453d13"), "searchword" : "window" } 
{ "_id" : ObjectId("4ecd2e39dd68c9021e453d14"), "searchword" : "Win" } 

> db.reg.find({ searchword: /^win$/i }) 
{ "_id" : ObjectId("4ecd2e33dd68c9021e453d12"), "searchword" : "win" } 
{ "_id" : ObjectId("4ecd2e39dd68c9021e453d14"), "searchword" : "Win" } 

Jednak wersja nie działa, ponieważ nie trzeba się „/” S Podczas za pomocą operatora $ regex:

> db.reg.find({ searchword: { $regex: "^win$", $options: '-i' }}) 
{ "_id" : ObjectId("4ecd2e33dd68c9021e453d12"), "searchword" : "win" } 
{ "_id" : ObjectId("4ecd2e39dd68c9021e453d14"), "searchword" : "Win" } 

Należy pamiętać, że wielkość liter ma znaczenie zapytania nie korzystają z indeksu więc może warto byłoby zrobić małą pole Searchword tak, że można przyspieszyć tej kwerendy w górę.

Go here uzyskać więcej informacji na regularexpressions

+1

$ tekst nie zastępuje regex. Jest dość restrykcyjny i nie pozwoli mu znaleźć "zimy" z poszukiwaniem "wygranej". –

+0

@BT Masz rację. W tym celu należałoby przechowywać n-gramy i dopasować je do nich. [Wyszukiwanie rozmyte za pomocą MongoDB i Python] (https://medium.com/xeneta/fuzzy-search-withmonmon-i-python-57103928ee5d#.yg7f3428b) – Rohmer

+0

Także: [Indeksy niewrażliwe na wielkość liter] (https: // docs .mongodb.com/manual/core/index-case-insensitive /) – Rohmer

-1

Na wielkość liter ma znaczenie db.users.find ({ "name": {$ regex: new RegExp ("Vi", "I")}})

Na wielkość liter db.users.find ({ "name": "Vi"}) lub db.users.find ({ "email": "[email protected]"})

wyszukiwania w tabeli użytkownika

nazwa jest co nazwa kolumny i tekst "Vi", które są wyszukiwane:

57

Możesz użyć $options => i do wyszukiwania bez rozróżniania wielkości liter. Podanie niektórych możliwych przykładów wymaganych do dopasowania ciągów.

Dokładna wielkość liter ma znaczenie string

db.collection.find({name:{'$regex' : '^string$', '$options' : 'i'}}) 

Zawiera string

db.collection.find({name:{'$regex' : 'string', '$options' : 'i'}}) 

Zacznij string

db.collection.find({name:{'$regex' : '^string', '$options' : 'i'}}) 

Koniec z string

db.collection.find({name:{'$regex' : 'string$', '$options' : 'i'}}) 

Nie Zawiera string

db.collection.find({name:{'$regex' : '^((?!string).)*$', '$options' : 'i'}}) 

Należy o tym jak zakładki, a punktem odniesienia dla wszelkich innych zmian może być konieczne. http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/

+0

Przez pomyłkę wstawiłeś przykład "Zawiera ciąg" w polu "Dokładny ciąg znaków niewrażliwy na wielkość liter" i na odwrót. Edytowałem twoją odpowiedź, zamieniając przykłady dla tych dwóch przypadków, a także poprawiłem błędy gramatyczne. – gauravparmar

+0

@gauravparmar: Sprawdź i popraw, jeśli coś jest nie tak. –

+0

Ja zredagowałem twoją odpowiedź, ale to musi być recenzowane, mówi. – gauravparmar

Powiązane problemy