首页 > 解决方案 > mongoid 搜索中的正则表达式

问题描述

我对如何在 mongoid 中通过文本搜索实现正则表达式有点困惑

我用我的联系人模型索引,如下所示:

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

在我的搜索操作中,我有:

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

因此,当我传递一个字符串时,例如"Joh",并且我希望它返回不区分大小写的结果,其中将包括名称为"Majoh""Majohboo""John"的联系人,因为我在搜索字符串周围添加了正则表达式。

我做错了什么,我的查询应该如何实现?如果我无法使用文本类型索引来实现这一点,那么您会建议我用什么替换我的索引?

标签: ruby-on-railsmongodbmongoid

解决方案


您似乎将正则表达式查询与全文搜索混淆了。

要执行正则表达式查询,请传递正则表达式:

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。这不使用正则表达式。

您需要了解全文搜索和正则表达式查询之间的区别。每个都有它的用途。与全文搜索相比,开发人员通常更熟悉正则表达式,因此您可能会从阅读全文搜索的工作原理中受益。全文搜索不适用于任意单词片段,因为它是基于词位工作的。正则表达式不会简化为词位,因此对于许多自然语言查询来说是一个糟糕的选择。

如果您想使用正则表达式进行查询,您可以通过将多个条件(每个字段一个)与 $or 组合来在多个字段上执行此操作。如果您想要全文搜索,正则表达式不适用,定义一个包含您希望搜索的所有字段的全文搜索索引并使用 $text 运算符。


推荐阅读