首页 > 解决方案 > PyMongo $regex 跨所有文本字段和子字段

问题描述

我有一个相当复杂的 Mongo 集合,我正在尝试实现详细的匹配标准。我已经在所有字段中创建了一个文本索引,如下所示:

db.create_index([("$**", "text")], name='allTextFields')

我将它用于 PyMongo 中的一些简单的搜索词(例如,“移民”),如下所示:

db.find({'$text': {'$search': "immigration"}

但是,我需要匹配某些足够通用的术语,以至于需要正则表达式类型规范。例如,我想匹配所有出现的“ice”而不找到“police”和各种其他排除项。

理想情况下,我可以创建一个搜索所有字段和子字段的正则表达式(参见下面的示例),但我无法弄清楚如何在 PyMongo(或 Mongo 中)实现这一点。

db.find({all_fields_and_subfields: {'$regex': '^ice\s*', '$options': 'i'}

有谁知道该怎么做?

标签: pythonregexmongodbmongodb-querypymongo

解决方案


这样做的一种方法是在文档中添加另一个字段,其中包含您要搜索的所有字段的串联,并在其上添加 $regex。

请注意,除非您的正则表达式锚定到输入的开头,否则它们不会使用索引(因此您将进行集合扫描)。

我很惊讶“ice”的全文查询会找到“police”,这肯定是某个地方的错误。

您也可以考虑使用 Atlas 搜索而不是全文搜索,后者更强大但为 Atlas 专有。


推荐阅读