2014-04-07 13 views
18

dönmek ilerleyin. Tüm belgeleri geri vermek istiyorum, böylece verileri soyutlayabilir ve bir csv'ye yazabilirim. Bunu, aşağıdaki kodu kullanarak 10 belge için (varsayılan geri dönüş) kolayca gerçekleştirebildim. Ben tarama & kaydırma uygulamak çalışırkentarama elasticsearch-py ve 3 milyon belgeleri içeren benim ES veritabanına bağlanmak için elasticsearch-py kullanıyorum tüm belgeleri

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 

Maalesef, bu yüzden ben sorunlarla karşılaştıysanız tüm belgeleri alabilir. Başarısız iki farklı yol denedim. Ben önce scanResp çıktısını Eğer

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" 

:

Yöntem 1: o zaman kaydırma id verir ve scroll/ sonra

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 ?scroll=10m (Caused by <class 'httplib.BadStatusLine'>: ''))

Yöntem 2 ile biter döngü <generator object scan at 0x108723dc0> olsun. Bu nedenle ben nedense benim kaydırma berbat ediyorum nispeten eminim, ama nereye veya nasıl düzeltebilirim emin değilim.

Sonuçlar: Yine enter image description here , scroll/ sonra kaydırma id verir ve daha sonra ?scroll=10m (Caused by <class 'httplib.BadStatusLine'>: ''))

Max taşıma sınıf için yeniden deneme artan çalıştı

ile sona erer, ama bu bir difference.I olur çok yapmadığını Bunu nasıl düzelteceğinizle ilgili herhangi bir anlayış için çok teşekkür ederiz.

Not: My ES, aynı ağ üzerindeki uzak bir masaüstünde bulunur.

cevap

8

piton tarama yöntemi dinlenme API için bir GET çağrısı oluşturuyor. Http üzerinden scroll_id'inizi göndermeye çalışıyor. Burada en olası durum sizin scroll_id http üzerinden gönderilemeyecek kadar büyük olduğunu ve hiçbir yanıt verir çünkü böylece bu hatayı görüyorsanız olmasıdır.

Kaydırma_derinin sahip olduğunuz parça sayısına bağlı olarak büyüdüğünden, bir POST kullanmak ve scroll_id öğesinin isteğinin bir parçası olarak JSON'a gönderilmesi daha iyidir. Bu şekilde, bir http araması için çok büyük olmasının sınırlarını aşarsınız.

+3

Bu hata geliyordu aslında:

Ben basit bir çözümü var, sen scroll_id aşağıdaki gibi kaydırma yöntemini çağırdıktan sonra her seferinde değiştirmeniz gerekir. Bir süre bunu düzeltdiler, ancak basit bir pip install --update elasticsearch problemin resmi cevabıydı. [yapmak Elasticsearch.scroll kaydırma KIMLIĞI POST] (https://github.com/elasticsearch/elasticsearch-py/pull/28) – drowningincode

+3

Yani gerçekten nasıl çözdüğünüzü anlamıyorum ... – Dror

+0

Kullandığınızdan emin olun Elasticsearch'in güncel bir versiyonu. Benim sorunum, bu – drowningincode

0

Sorun çözüldüğünde var mı?

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

scrollId = response_tmp['_scroll_id']