在pymongo中灵活地将$和$或与$ text运算符组合

时间:2019-04-02 03:29:31

标签: mongodb text pymongo

我有一个关键字对列表。我需要在mongoDB集合中找到包含任何关键字对的所有文档。

我已经在互联网上搜索了数小时来寻找答案,但是找不到。我认为我需要的是一种灵活地组合$和(因此关键字对的两个组成部分都存在于结果中),$ or(这样任何关键字对都可以满足要求)和$ text(这样我可以在词干/区分大小写等运算符上具有一定的灵活性。但是我意识到$ text运算符不能与$ and / $ or一起使用。我知道这篇文章(MongoDB Text Search AND multiple search words),但它并不能完全满足我的需求...

举个例子:

这是一个简单的演示集合:

mydb = client.XXX
mycol = mydb["XXX"]

mylist = [
    {"_id": 1, "hashtag": [], "message": "PrEP is useful"},
    {"_id": 2, "hashtag": [], "message": "prep1 is not what we want"},
    {"_id": 3, "hashtag": ["#AIDS"], "message": "will bandaid be picked?"},
    {"_id": 4, "hashtag": ["#HIV"], "message": "hiv we care" },
    {"_id": 5, "hashtag": [], "message": "Aids support organization - does multi-word phrase work as it should?"},
    {"_id": 6, "hashtag": [], "message": "sti"},
    {"_id": 7, "hashtag": [], "message": "stis prevention"},
    {"_id": 8, "hashtag": [], "message": "sti space prevention"}
]

mycol.insert_many(mylist)

我的关键词对列表如下:

k = ['"sti" "prevention"',
 '"PrEP" "useful"',
 '"stis" "prevention"',
 '"std" "treatall"',
 ......] 

这些是我尝试不使用“ k”的几种方法。但最终我想使用“ k”:

下面的代码块可以很好地工作,但是它不能同时搜索多个关键字对。

m = mycol.find({
    '$text': {'$search': '"sti" "prevention"'},
 })
for items in m:
    pprint.pprint (items['message'])

我尝试在不同的地方添加$或,但是都失败了... 故障编号1:

m = mycol.find({ '$or':[
    '$text': {'$search': '"sti" "prevention"'},
    '$text': {'$search': '"PrEP" "useful"'}
    ] 
    })
for items in m:
    pprint.pprint (items['message'])

故障2:

m = mycol.find({ 
    '$text': {'$or':[{'$search': '"sti" "prevention"'},
                     {'$search': '"PrEP" "useful"'}]
             }})
for items in m:
    pprint.pprint (items['message'])

我的预期结果示例: 对于2个关键字对的列表['“ sti”“ prevention”','“ PrEP”“ use”'] 我应该得到ID 1、7和8。

0 个答案:

没有答案