【问题标题】:MongoDB - Using regex wildcards for search that properly filter resultsMongoDB - 使用正则表达式通配符进行正确过滤结果的搜索
【发布时间】:2013-07-20 00:31:27
【问题描述】:

我有一个 Mongo 搜索设置,它会根据许多条件检查我的条目。

目前最简单的方法(由于使用通配符,我知道它对性能不友好,但由于不区分大小写并且用户不输入整个单词,我无法找到更好的方法)是使用正则表达式通配符在搜索中。搜索结果如下所示:

{ gender: /Womens/i, designer: /Voodoo Girl/i } // Should return ~200 results
{ gender: /Mens/i, designer: /Voodoo Girl/i } // Should return 0 results

在上面的示例中,两个搜索都返回了大约 200 个结果(“Voodoo Girl”是一个女装标签,所有对应的条目都有一个 gender: "Womens" 字段。)。奇怪的是,当我进行其他搜索时,例如:

{ designer: /Voodoo Girl/i, store: /Store XYZ/i } // 应该返回 0 个结果

我得到正确数量的结果 (0)。这是订单的事情吗?如何确保我的搜索only返回匹配所有通配符查询的结果?

作为参考,通过简单的db.products.find({criteria}) 查找在nodeJS 中进行查询。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    要真正快速回答问题,ElasticSearch 之类的内容是在您的应用中获得更强大、更高效的搜索功能的绝佳方式。

    现在,您的搜索返回结果的原因是“mens”是“womens”的子字符串!您可能需要/^Mens/i/^Womens/i(如果Mens 开始性别字段),或者/\bMens\b/(如果它可以出现在字段中间)。第一种形式只匹配字符串开头的给定字段,而第二种形式查找被单词边界包围的给定单词(即,不作为另一个单词的子字符串)。

    如果您可以使用/^Mens/ 形式(注意缺少/i),则建议使用锚定区分大小写的正则表达式查询can use indexes,而其他正则表达式形式则不能。

    $regex 只能在正则表达式在字符串的开头(即 ^)有一个锚点并且是区分大小写的匹配时才能有效地使用索引。

    【讨论】:

    • 哈哈哦哇,这太简单了,但我永远不会意识到这个答案!感谢您的详细回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    相关资源
    最近更新 更多