Pymongo全文搜索
问题描述:
即将推出的MongoDB 2.4支持full-text search。Pymongo全文搜索
我们这样做是在命令蒙戈外壳,如
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})
其工作。但是这并不完全告诉我如何让它在pymongo中工作。我试过:
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})
哪一个当然会失败:“no such cmd:project”。
我可以得到,如果我只用search
和limit
,例如
db.command({
"text": "players",
"search": "alice",
"limit": 10})
,但我想用filter
和project
与pymongo东西的工作。有没有人得到全文搜索与项目和过滤器工作?
另外:也许有一个很好的方法来从shell命令推断pymongo命令的形状?
答
想通了:pymongo使用关键字参数的附加命令参数:
db.command("text", "players",
search="alice",
project={"name": 1, "_id": 0},
limit=10)
的原因奇怪的错误消息“没有这样的CMD:项目”是Python的字典是无序的,而project
关键当传递给mongo时恰好是第一个。
答
另一种解决方案是使用OrderedDict。假设采集和查询给定为变量,而其他参数如限制,投影等人在字典“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)
这是否工作正则表达式呢?像db.command(“regex”,“players”,search =“alice”) – Jeff 2014-03-16 02:46:10
我不熟悉'regex'命令。它没有出现在MongoDB的[官方命令列表](http://docs.mongodb.org/manual/reference/command/)上。 – 2014-03-16 05:12:13