Регулярное выражение в поисках монгоидов - PullRequest
0 голосов
/ 18 февраля 2020

Я немного озадачен тем, как получить регулярное выражение с помощью текстового поиска в mongoid.

Я индексирую свою модель контактов следующим образом:

index(FirstName: "text", LastName: "text")

В моем поисковом действии я имею :

search = '/.*' + search_string + '.*/'
@contacts.collection.find( { '$text': { '$search': search } }, "collation" => { "locale" => "en_US" } )

Поэтому, когда я передаю строку, например "Joh" , и я ожидаю, что она выдаст результаты без учета регистра, которые будут включать контакты с именами, такими как "Majoh" , "Majohboo" и "Джон" из-за регулярного выражения, которое я добавил вокруг строки поиска.

Что я делаю неправильно и что должен делать мой запрос быть как достичь этого? Если я не могу добиться этого с помощью индекса текстового типа, то чем бы вы порекомендовали заменить индексирование на?

1 Ответ

1 голос
/ 18 февраля 2020

Вы, кажется, путаете запросы регулярного выражения с полнотекстовым поиском.

Чтобы выполнить запрос регулярного выражения, передайте регулярное выражение:

irb(main):002:0> Band.create!(name: 'hello')
=> #<Band _id: 5e4b39e5026d7c7b6fcfc1ad, name: "hello", description: nil>
irb(main):003:0> Band.collection.find(name: /el/).first
=> {"_id"=>BSON::ObjectId('5e4b39e5026d7c7b6fcfc1ad'), "name"=>"hello"}
irb(main):004:0> Band.collection.find(name: /EL/).first
=> nil
irb(main):006:0> Band.collection.find(name: /EL/i).first
=> {"_id"=>BSON::ObjectId('5e4b39e5026d7c7b6fcfc1ad'), "name"=>"hello"}

Это не использует $text оператор.

Чтобы выполнить полнотекстовый поиск, см. https://docs.mongodb.com/mongoid/master/tutorials/mongoid-queries/#full -text-search . При этом не используются регулярные выражения.

Необходимо понимать разницу между полнотекстовым поиском и запросами регулярных выражений. У каждого есть свое применение. Разработчики, как правило, лучше знакомы с регулярными выражениями, чем с полнотекстовым поиском, поэтому, возможно, вам было бы полезно узнать, как работает полнотекстовый поиск. Полнотекстовый поиск не работает для произвольных фрагментов слов, потому что он работает на основе лексем. Регулярные выражения не сводятся к лексемам слов и, следовательно, являются плохим выбором для многих запросов на естественном языке.

Если вы хотите выполнять запросы с регулярными выражениями, вы можете сделать это для нескольких полей, комбинируя несколько критериев (по одному на поле ) с $ или. Если вы хотите полнотекстовый поиск, регулярные выражения не применимы, определите индекс полнотекстового поиска, содержащий все поля, которые вы будете sh искать и использовать оператор $ text.

...