我有一个关键字列表:
keywords = ['word1', 'word2', 'word3']
现在我只查询1个关键字:
collection.find({'documenttextfield': {'$regex': ' '+keyword+' '}})
我绝不是正则表达式中的大师,所以我在关键字一侧使用空格雷鬼找到完全匹配。
但我现在想要的是,拥有keywords
列表,查询文档并找到documenttextfield
列表中包含每个关键字的文档。
我有一些关于如何做到这一点的想法,但它们有点过于复杂,我觉得我错过了一些东西......
答案 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搜索该字段(在这种情况下不需要正则表达式)。