Полнотекстовый поиск по Pymongo
Предстоящий MongoDB 2.4 поддерживает полнотекстовый поиск.
Мы делаем это в оболочке mongo с помощью команды, например
db.players.runCommand("text", {
"search": "alice",
"project": {"name": 1, "_id": 0},
"limit": 10})
Теперь, перенося это на pymongo, мы должны иметь дело с тем, что runCommand
не определен в классе pymongo Collection
. Мне удалось выяснить, что такое настоящая команда, поэтому это работало в оболочке:
db.runCommand({
"text": "players",
"search": "alice",
"project": {"name": 1, "_id": 0},
"limit": 10})
который работал. Но это точно не говорит мне, как заставить это работать на пимонго. Я пробовал:
db.command({
"text":"players",
"pipeline": [
("search","alice"), ("project",{"name":1,"_id":0}), ("limit",10)
]})
который не работал (он сказал, что "поиск не указан" ). Я также пробовал:
db.command({
"text": "players",
"search": "alice",
"project": {"name": 1, "_id": 0},
"limit":10})
который, конечно же, терпит неудачу: "нет такого cmd: project".
Я могу заставить работать, если я использую только search
и limit
, например
db.command({
"text": "players",
"search": "alice",
"limit": 10})
но я хотел бы использовать filter
и project
с pymongo. Кто-нибудь получил полнотекстовый поиск, работающий с проектом и фильтром?
Помимо этого: Может быть, есть хороший способ вывести форму команды pymongo из команды оболочки?
Ответы
Ответ 1
Выяснилось: pymongo использует аргументы ключевого слова для дополнительных аргументов команды:
db.command("text", "players",
search="alice",
project={"name": 1, "_id": 0},
limit=10)
Причиной нечетного сообщения об ошибке "no такой cmd: project" является то, что словари Python неупорядочены, а ключ project
оказался первым при передаче в mongo.
Ответ 2
Альтернативным решением является использование OrderedDict. Предполагая, что сбор и запрос заданы как переменные, в то время как дополнительные параметры, такие как предел, проекция и другие данные в dict 'params':
params_ord = OrderedDict()
params_ord['text'] = collection
params_ord['search'] = query
for k,v in params.iteritems():
params_ord[k] = v
db.command(params_ord)