Mongo Python 中的缓慢正则表达式



我在mongo python中有一个查询,看起来像:

collection.find({"name" : {$in : ["foo_foo", "bar_bar"]}})

我现在想匹配像"foo_bar"、"foo_foe"等名称。所以我使用了一个常规的表达式:

collection.find({ $or : [{"name" : {"$regex" : "foo_.*" }}, 
   {"name" : {"$regex" : "bar_.*" }}] })

但是,当查找大量条目时,第二个查询的速度要慢数千倍。我不知道如何改善这一点。任何提示将不胜感激。真正让我惊讶的是,匹配"foo_foo"字符串应该比匹配字符串"foo_.*"慢。

您可能想尝试一下:

collection.find({ $or : [{"name" : {"$regex" : "^foo_" }}, 
   {"name" : {"$regex" : "^bar_" }}] })

甚至

collection.find({"name" : {"$regex" : "^(foo|bar)_" }})

您应该看到执行时间的大幅改善。原因是您的正则表达式有效地在字符串中搜索"foo_",不一定从字符串的开头开始。因此,它将匹配"foo_"和"someotherfoo_",但在后一种情况下,它需要一直解析到字符串的末尾。

确保您还阅读并理解文档的该部分:

此外,虽然/^a/

、/^a./和/^a。$/匹配等值 字符串,它们具有不同的性能特征。所有这些 如果存在适当的索引,则表达式使用索引;然而 /^a./和/^a。$/较慢。/^a/匹配后可以停止扫描 前缀。

除此之外,我想,

如果您无法添加索引,您将无能为力。

最新更新