2013-03-06 16 views
11

Il prossimo MongoDB 2.4 supporta full-text search.Ricerca a testo completo in Pymongo

Lo facciamo nella shell mongo con un comando, come ad esempio

db.players.runCommand("text", { 
    "search": "alice", 
    "project": {"name": 1, "_id": 0}, 
    "limit": 10}) 

Ora, quando il porting questo pymongo, abbiamo a che fare con il fatto che runCommand non è definito sulla pymongo Collection di classe. Sono stato in grado di capire ciò che il comando vera era, quindi questo lavorato nella shell:

db.runCommand({ 
    "text": "players", 
    "search": "alice", 
    "project": {"name": 1, "_id": 0}, 
    "limit": 10}) 

che funzionava. Ma questo non mi dice esattamente come farlo funzionare in pymongo. Ho provato:

db.command({ 
    "text":"players", 
    "pipeline": [ 
     ("search","alice"), ("project",{"name":1,"_id":0}), ("limit",10) 
    ]}) 

che non ha funzionato (ha detto "nessuna ricerca specificata"). Ho anche provato:

db.command({ 
    "text": "players", 
    "search": "alice", 
    "project": {"name": 1, "_id": 0}, 
    "limit":10}) 

che naturalmente non riesce con: "no tale cmd: progetto".

posso far funzionare le cose se io uso solo search e limit, per esempio

db.command({ 
    "text": "players", 
    "search": "alice", 
    "limit": 10}) 

ma vorrei usare filter e project con pymongo. Qualcuno ha ottenuto la ricerca full-text lavorando con progetto e filtro?

A parte questo: Forse c'è un buon modo per dedurre la forma di un comando pymongo da un comando di shell?

risposta

11

capito: pymongo utilizza argomenti chiave per gli argomenti del comando aggiuntivi:

db.command("text", "players", 
    search="alice", 
    project={"name": 1, "_id": 0}, 
    limit=10) 

Il motivo per il messaggio strano errore "nessuna di tali cmd: progetto" è che i dizionari di Python non sono ordinati, e la project chiave è successo per primo quando è passato a mongo.

+0

fa questo lavoro per regex così? come db.command ("regex", "players", search = "alice") – Jeff

+0

Non ho familiarità con il comando 'regex'. Non appare su [l'elenco ufficiale dei comandi] (http://docs.mongodb.org/manual/reference/command/) da MongoDB. –

0

Una soluzione alternativa è utilizzare OrderedDict. Supponendo che la raccolta e l'interrogazione sono dati come le variabili, mentre i parametri aggiuntivi come limite, proiezione e altri dati nelle 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) 
Problemi correlati