Сканирование elasticsearch-py и прокрутка для возврата всех документов

Я использую elasticsearch-py для подключения к моей базе данных ES, содержащей более 3 миллионов документов. Я хочу вернуть все документы, чтобы я мог абстрагировать данные и записать их в csv. Я смог легко выполнить это для 10 документов (возврат по умолчанию), используя следующий код.

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

К сожалению, когда я попытался выполнить проверку и прокрутку, чтобы я мог получить все документы, на которые я столкнулся с проблемами. Я пробовал это двумя разными способами без успеха.

Способ 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 После scroll/ он выдает идентификатор прокрутки и заканчивается на ?scroll=10m (Caused by <class 'httplib.BadStatusLine'>: ''))

Способ 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"

Если я распечатаю scanResp перед циклом for, я получаю <generator object scan at 0x108723dc0>. Из-за этого я относительно уверен, что я каким-то образом испортил свой свиток, но я не уверен, где и как его исправить.

Результаты: enter image description here Опять же, после scroll/ он дает идентификатор прокрутки, а затем заканчивается на ?scroll=10m (Caused by <class 'httplib.BadStatusLine'>: ''))

Я попытался увеличить Макс. попытки для класса транспорта, но это не изменило ситуацию. Я очень хотел бы понять, как это исправить.

Примечание. Мои ES находятся на удаленном рабочем столе в той же сети.

Ответ 1

Метод проверки python генерирует вызов GET для остальных api. Он пытается отправить ваш scroll_id через http. Наиболее вероятный случай заключается в том, что ваш scroll_id слишком велик для отправки по http, и поэтому вы видите эту ошибку, потому что она не возвращает ответа.

Поскольку scroll_id растет на основе количества осколков, которое у вас есть, лучше использовать POST и отправлять scroll_id в JSON как часть запроса. Таким образом, вы обходите ограничение того, что оно слишком велико для вызова http.

Ответ 2

Вы опубликовали решение?

У меня есть одно простое решение, вы должны менять scroll_id каждый раз после вызова метода прокрутки, как показано ниже:

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

scrollId = response_tmp['_scroll_id']