如何在mongodb(pymongo)中查询所有关键字存在于字段中的文档?

时间:2016-03-27 19:39:45

标签: python regex mongodb pymongo

我有一个关键字列表:

keywords = ['word1', 'word2', 'word3']

现在我只查询1个关键字:

collection.find({'documenttextfield': {'$regex': ' '+keyword+' '}})

我绝不是正则表达式中的大师,所以我在关键字一侧使用空格雷鬼找到完全匹配。

但我现在想要的是,拥有keywords列表,查询文档并找到documenttextfield列表中包含每个关键字的文档。

我有一些关于如何做到这一点的想法,但它们有点过于复杂,我觉得我错过了一些东西......

1 个答案:

答案 0 :(得分:1)

考虑将text index$text search一起使用。它可能是比使用正则表达式更好的解决方案。但是,文本搜索会根据评分算法返回文档,因此您可能会获得一些不具备您要查找的所有关键字的结果。

如果您不能或不想在此字段中添加文字索引,那么使用单个正则表达式会非常痛苦,因为您不知道这些字词的顺序出现。我并不是说不可能写,但即使是正则表达标准,你最终也会遭受可怕的憎恶。通过使用$and运算符,可以更容易地多次使用正则表达式运算符。

此外,当单词位于字符串的开头或结尾或后跟句点或逗号时,使用空格作为分隔符将会失败。请改用字边界标记(\b)。

collection.find(
    { $and : [
              {'documenttextfield': {'$regex': '\b' +keyword1+'\b'}},
              {'documenttextfield': {'$regex': '\b' +keyword2+'\b'}},
              {'documenttextfield': {'$regex': '\b' +keyword3+'\b'}},
         ]
    });

请记住,这是一个非常慢的查询,因为它会在集合的每个文档上运行这三个正则表达式。当这是一个性能关键的查询时,请认真考虑文本索引是否真的不会做。如果做不到这一点,最后需要掌握的是从有人可以搜索的documenttextfield字段中提取任何关键字(可能是其中的每个唯一字)到新的数组字段documenttextfield_keywords中,创建一个该字段上的普通索引,并使用$all operator搜索该字段(在这种情况下不需要正则表达式)。