2013-04-10 12 views
7

Ich versuche, Volltext-Suche auf einem Mongodb db mit der Elastic Search Engine zu tun, aber ich lief auf ein Problem: egal, welchen Suchbegriff ich (oder wenn ich query1 oder query2) liefert die Engine immer die gleichen Ergebnisse. Ich denke, das Problem liegt in der Art, wie ich die Anfragen stelle, aber ich weiß nicht, wie ich das lösen soll. HierAbfragen von ElasticSearch mit Python-Anfragen funktioniert nicht einwandfrei

ist der Code:

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

diese Anglotzen Nur schnell ... hat Ihre „fuzzy“ -Klausel Notwendigkeit in einer „Abfrage“ verpackt werden? Also würde die Struktur "Abfrage" werden: {"Fuzzy": {...}}, "Filter": {...}. Kannst du das Ergebnis, das du von deiner Anfrage erhältst, posten, damit wir versuchen können, ob etwas offensichtlich ist? – Phil

+0

Die Anfrage gibt 10 Elemente zurück, egal was ich suche.Ich weiß nicht, was ich falsch mache. – Rod0n

+0

Werden die Daten wirklich zurückgegeben? Sind die Dokumente gültige Dokumente oder etwas anderes? Haben Sie eine einfache URI-Suche probiert, die den Dokumenttyp und den Suchparameter in einem angibt? Beispiel: curl -XGET 'http: // localhost: 9200/newsidx/some_type/_search? Q = art_text: Hallo'. Oder etwas, das ein Tag durchsucht, das nicht Ihr Feld "art_text" ist. Nur versuchen, dir zu helfen, die Dinge zu verengen – Phil

Antwort

16

Der params Parameter ist nicht für Daten gesendet werden. Wenn Sie versuchen, Daten an den Server zu senden, sollten Sie speziell den Datenparameter verwenden. Wenn Sie versuchen, Abfrageparameter zu senden, sollten Sie sie nicht JSON-encodieren und sie nur params als Diktat übergeben.

Ich vermute, dass Sie Ihre erste Anfrage die folgende sein sollten:

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

Und bevor jemand mich downvotes, ja das HTTP/1.1-Spezifikation ermöglicht es, Daten mit GET-Anfragen und ja Anfragen gesendet werden sie nicht unterstützt.

+3

Niemand würde dich abschwächen! – Steve

Verwandte Themen