我有一个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)。这是订单吗?如何确保我的搜索仅返回与我的通配符查询所有匹配的结果?
供参考,我们通过简单的nodeJS
查询在db.products.find({criteria})
中进行查询。
答案 0 :(得分:2)
要快速回答这一点,ElasticSearch之类的内容是在您的应用中获得更强大,更高效的搜索功能的绝佳方式。
现在,您的搜索返回结果的原因是“男性”是“女性”的子串!您可能需要/^Mens/i
和/^Womens/i
(如果Mens启动性别字段),或者/\bMens\b/
,如果它可以出现在字段的中间。第一个表单只匹配字符串开头的给定字段,而第二个表单查找由单词边界包围的给定单词(即不作为另一个单词的子字符串)。
如果你可以使用/^Mens/
表单(注意缺少/i
),那么建议使用锚定区分大小写的正则表达式查询can use indexes,而其他正则表达式不能。{ / p>
$ regex只能在正则表达式具有字符串开头(即^)的锚点时有效地使用索引,并且是区分大小写的匹配。