【问题标题】:Regex in mongoid searchmongoid 搜索中的正则表达式
【发布时间】:2020-06-01 20:41:51
【问题描述】:

我对如何在 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-rails mongodb mongoid


    【解决方案1】:

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

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

    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 运算符。

    【讨论】:

    • 确实,我更新了我的问题,并且应该澄清我将多个字段索引为文本。我需要同时对多个字段进行正则表达式搜索。有一种方法可以创建一个“所有”字段,将所有这些字段合并在一起并进行搜索,但我认为它很难看。除了将搜索切换到 ElasticSearch 之外,有没有办法同时对多个字段执行正则表达式?
    • 更新了答案,但听起来你提出了一个 XY 问题。
    猜你喜欢
    • 1970-01-01
    • 2013-05-24
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2014-06-02
    • 2023-04-10
    • 2013-08-16
    相关资源
    最近更新 更多