2013-04-10 15 views
7

Sto cercando di eseguire una ricerca full-text su un db mongodb con il motore di ricerca elastico, ma ho riscontrato un problema: non importa quale termine di ricerca fornisco (o se uso query1 o query2), il motore restituisce sempre gli stessi risultati. Penso che il problema sia nel modo in cui faccio le richieste, ma non so come risolverlo.Interrogazione di ElasticSearch con Python Richieste che non funzionano bene

Ecco il codice:

def search(search_term): 
    query1 = { 
     "fuzzy" : { 
      "art_text" : { 
       "value" : search_term, 
       "boost" : 1.0, 
       "min_similarity" : 0.5, 
       "prefix_length" : 0 
      } 
     }, 
     "filter": { 
      "range" : { 
       "published": { 
        "from" : "20130409T000000", 
        "to": "20130410T235959" 
       } 
      } 
     } 
    } 
    query2 = { 
     "match_phrase": { "art_text": search_term } 
    } 

    es_query = json.dumps(query1) 
    uri = 'http://localhost:9200/newsidx/_search' 
    r = requests.get(uri, params=es_query) 
    results = json.loads(r.text) 
    data = [res['_source']['api_id'] for res in results['hits']['hits'] ] 
    print "results: %d" % len(data) 
    pprint(data) 
+0

Proprio eyeballing in fretta ... Il vostro "fuzzy" bisogno clausola per essere avvolti all'interno di una "query"? Quindi la struttura diventerebbe "query": {"fuzzy": {...}}, "filtro": {...}. Puoi pubblicare il risultato che ottieni dalla tua richiesta in modo che possiamo provare e vedere se c'è qualcosa di ovvio. – Phil

+0

La richiesta restituisce 10 elementi, indipendentemente dal tipo di search_term che fornisco. Non so cosa sto facendo male. – Rod0n

+0

I dati sono restituiti reali? I documenti sono documenti validi o qualcos'altro? Hai provato una semplice ricerca uri che specifica il tipo di documento e i parametri di ricerca tutti in uno? Ad esempio: curl -XGET 'http: // localhost: 9200/newsidx/some_type/_search? Q = art_text: hello'. O forse qualcosa che cerca un tag che non è il tuo campo art_text. Sto solo cercando di aiutarti a restringere le cose – Phil

risposta

16

Il parametro params non è per i dati inviati. Se stai cercando di inviare dati al server dovresti utilizzare in modo specifico il parametro data. Se stai cercando di inviare parametri di query, non dovresti essere codificandoli con JSON e affidali a params come dettato.

ho il sospetto la tua prima richiesta dovrebbe essere la seguente:

r = requests.get(uri, data=es_query) 

E prima che qualcuno mi downvotes, sì, la/1.1 specifiche HTTP consente ai dati di essere trasmessi con richieste GET e sì le richieste di non sostenerlo.

+3

Nessuno ti farebbe una downvote! – Steve

Problemi correlati