Гибко комбинируйте $ и $ или оператор $ text в pymongo - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть список пар ключевых слов.Мне нужно найти все документы в коллекции mongoDB, которые содержат любые пары ключевых слов.

Я искал часы в Интернете, чтобы найти ответ, но не смог.Я думаю, что мне нужен способ гибкого комбинирования $ и (чтобы оба компонента пары ключевых слов существовали в результате), $ или (чтобы любая из пар ключевых слов удовлетворяла требованию) и $ text (чтобы я могиметь некоторую гибкость в отношении операторов определения регистра / чувствительности к регистру и т. д.Но я понимаю, что оператор $ text нельзя использовать вместе с $ и / $ or.Я знаю об этом сообщении ( MongoDB Text Search И множественные поисковые слова ), но он не выполняет именно то, что мне нужно ...

Чтобы привести пример:

Это простая демонстрационная коллекция:

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" "предотвращение"', '"PrEP" "use"'] я должен получить идентификаторы 1, 7 и 8.

...