ruby-on-rails - mongoid 搜索中的正则表达式
问题描述
我对如何在 mongoid 中通过文本搜索实现正则表达式有点困惑
我用我的联系人模型索引,如下所示:
index(FirstName: "text", LastName: "text")
在我的搜索操作中,我有:
search = '/.*' + search_string + '.*/'
@contacts.collection.find( { '$text': { '$search': search } }, "collation" => { "locale" => "en_US" } )
因此,当我传递一个字符串时,例如"Joh",并且我希望它返回不区分大小写的结果,其中将包括名称为"Majoh"、"Majohboo"和"John"的联系人,因为我在搜索字符串周围添加了正则表达式。
我做错了什么,我的查询应该如何实现?如果我无法使用文本类型索引来实现这一点,那么您会建议我用什么替换我的索引?
解决方案
您似乎将正则表达式查询与全文搜索混淆了。
要执行正则表达式查询,请传递正则表达式:
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 运算符。
推荐阅读
- arrays - 数组下标超出范围的 VLOOKUP
- python - 安装 tensorflow,出现错误“pip3”不是内部或外部命令、可运行程序或批处理文件”
- javascript - 在外部 JavaScript 文件中调用函数时出错
- python - boto3 / s3 - 你如何像以前一样与 uid/pwd 连接?
- c - 统计信息在while循环内不是动态的
- vba - 错误 462 VBA - Excel 和 PPT 之间的自动化
- php - 如何设置变量分隔符
- json.net - Newtonsoft:如何在使用 `JsonConvert.DeserializeObject 时获取评论
(json, new JsonSerializerSettings())`? - angular - Angular - 在 canActivate 之前解析 Observable 数据
- asp.net - 智能感知列表中没有表单水平项