2014-04-07 18 views
18

Sto usando elasticsearch-py per connettermi al mio database ES che contiene oltre 3 milioni di documenti. Voglio restituire tutti i documenti in modo da poter astrarre i dati e scriverli in un CSV. Sono riuscito a farlo facilmente per 10 documenti (il ritorno predefinito) usando il seguente codice.scansione elasticsearch-py e scorrere per restituire tutti i documenti

es=Elasticsearch("glycerin") 
query={"query" : {"match_all" : {}}} 
response= es.search(index="_all", doc_type="patent", body=query) 

for hit in response["hits"]["hits"]: 
    print hit 

Purtroppo, quando ho tentato di implementare la scansione & di scorrimento in modo da poter ottenere tutti i documenti ho incontrato problemi. L'ho provato in due modi diversi senza successo.

Metodo 1:

scanResp= es.search(index="_all", doc_type="patent", body=query, search_type="scan", scroll="10m") 
scrollId= scanResp['_scroll_id'] 

response= es.scroll(scroll_id=scrollId, scroll= "10m") 
print response 

enter image description here Dopo scroll/ dà l'id di scorrimento e poi conclude con ?scroll=10m (Caused by <class 'httplib.BadStatusLine'>: ''))

Metodo 2:

query={"query" : {"match_all" : {}}} 
scanResp= helpers.scan(client= es, query=query, scroll= "10m", index="", doc_type="patent", timeout="10m") 

for resp in scanResp: 
    print "Hiya" 

se stampo fuori scanResp prima della per loop ottengo <generator object scan at 0x108723dc0>. Per questo motivo sono relativamente certo che sto incasinando la mia scroll in qualche modo, ma non sono sicuro di dove o come risolverlo.

Risultati: enter image description here Anche in questo caso, dopo scroll/ dà l'id di scorrimento e poi conclude con ?scroll=10m (Caused by <class 'httplib.BadStatusLine'>: ''))

ho provato aumentando il Max tentativi per la classe di trasporto, ma che non ha fatto un difference.I sarebbe molto apprezzo molto qualsiasi idea su come risolvere questo problema.

Nota: My ES si trova su un desktop remoto sulla stessa rete.

risposta

8

Il metodo di scansione Python sta generando una chiamata GET al resto della API. Sta cercando di inviare oltre scroll_id su http. Il caso più probabile qui è che il tuo scroll_id è troppo grande per essere inviato su http e quindi stai vedendo questo errore perché non restituisce alcuna risposta.

Poiché scroll_id cresce in base al numero di frammenti disponibili, è preferibile utilizzare un POST e inviare lo scroll_id in JSON come parte della richiesta. In questo modo si ottiene il limite di essere troppo grande per una chiamata http.

+3

Questo è infatti dove l'errore venisse. Risulta che hanno riparato questo un po 'indietro, tuttavia una semplice installazione di pip --update elasticsearch è stata la risposta ufficiale al problema. [fai di Elasticsearch.scroll POST l'ID scroll] (https://github.com/elasticsearch/elasticsearch-py/pull/28) – drowningincode

+3

Quindi non capisco come lo risolvi effettivamente ... – Dror

+0

Assicurati di utilizzare una versione aggiornata di Elasticsearch. Il mio problema era che stavo usando una versione da prima di correggere questo – drowningincode

0

Il problema è stato risolto?

ho avuto una soluzione semplice, è necessario modificare il scroll_id ogni volta dopo che si chiama il metodo di scorrimento come di seguito:

response_tmp = es.scroll(scroll_id=scrollId, scroll= "1m") 

scrollId = response_tmp['_scroll_id'] 
Problemi correlati