2013-04-10 12 views
7

Próbuję wykonać wyszukiwanie pełnotekstowe na mongodb db z wyszukiwarką Elastic Search, ale napotkałem na problem: nie ma znaczenia, jakie wyszukiwane hasło podaję (lub jeśli używam zapytania 1) lub zapytanie2), silnik zawsze zwraca te same wyniki. Myślę, że problem polega na tym, że zgłaszam prośby, ale nie wiem, jak je rozwiązać.Wywoływanie ElasticSearch z pytaniami w Pythonie Nie działa dobrze

Oto kod:

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

Wystarczy eyeballing to szybko ... twoja "rozmyta" klauzula muszą być opakowane w środku "zapytania"? Tak więc struktura stanie się "zapytaniem": {"fuzzy": {...}}, "filter": {...}. Czy możesz przesłać wynik, który otrzymujesz ze swojej prośby, abyśmy mogli sprawdzić, czy jest coś oczywistego. – Phil

+0

Żądanie zwraca 10 elementów, bez względu na to, co dostarczam search_term. Nie wiem, co robię źle. – Rod0n

+0

Czy dane zwracane są prawdziwe? Czy dokumenty są ważnymi dokumentami, czy czymś innym? Czy wypróbowałeś proste wyszukiwanie URI, które określa typ dokumentu i parametry wyszukiwania w jednym? Na przykład: curl -XGET 'http: // localhost: 9200/newsidx/some_type/_search? Q = art_text: hello'. A może coś, co przeszukuje tag, który nie jest polem art_text. Po prostu staram się pomóc ci zawęzić sprawę – Phil

Odpowiedz

16

Parametr params nie jest dla wysyłanych danych. Jeśli próbujesz wysłać dane do serwera, powinieneś używać parametru data. Jeśli próbujesz wysłać parametry zapytania, nie powinieneś kodować je JSON i po prostu nadać je parametrom jako dyktom.

Podejrzewam Twoja pierwsza Żądanie powinno być następujące:

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

I zanim ktoś mnie downvotes, tak HTTP/1.1 Spec pozwala danych do wysłania z żądań GET i tak wnioski nie obsługuje.

+3

Nikt by cię nie zawiódł! – Steve

Powiązane problemy