У меня есть список пар ключевых слов.Мне нужно найти все документы в коллекции 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.