0

我有一个 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})查找进行的。

4

1 回答 1

2

为了快速回答问题,像ElasticSearch这样的东西是在您的应用程序中获得更强大、更高效的搜索功能的绝妙方法。

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

如果您可以使用该/^Mens/表单(注意缺少/i),建议您这样做,因为锚定的区分大小写的正则表达式查询可以使用索引,而其他正则表达式形式则不能。

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

于 2013-07-20T00:49:27.100 回答