python - index - Elasticsearch-py escanea y desplaza para devolver todos los documentos
python elasticsearch timeout (2)
Estoy usando elasticsearch-py para conectarme a mi base de datos de ES que contiene más de 3 millones de documentos. Quiero devolver todos los documentos para poder abstraer datos y escribirlos en un csv. Pude lograr esto fácilmente para 10 documentos (la declaración predeterminada) usando el siguiente código.
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
Desafortunadamente, cuando intenté implementar el escaneo y el desplazamiento para poder obtener todos los documentos que encontré en los problemas. Lo intenté de dos maneras diferentes sin éxito.
Método 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
Después de scroll/
da el id de scroll y luego termina con ?scroll=10m (Caused by <class ''httplib.BadStatusLine''>: ''''))
Método 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"
Si imprimo scanResp antes del bucle for, obtengo <generator object scan at 0x108723dc0>
. Debido a esto, estoy relativamente seguro de que estoy arruinando mi pergamino de alguna manera, pero no estoy seguro de dónde o cómo solucionarlo.
Resultados: Nuevamente, después de scroll/
da el id de scroll y luego termina con ?scroll=10m (Caused by <class ''httplib.BadStatusLine''>: ''''))
Intenté aumentar los reintentos máximos para la clase de transporte, pero eso no hizo una diferencia. Apreciaría mucho cualquier idea de cómo solucionar este problema.
Nota: Mi ES se encuentra en un escritorio remoto en la misma red.
¿Tienes problemas resueltos?
Tengo una solución simple, debes cambiar el scroll_id
cada vez que llames al método scroll como se muestra a continuación:
response_tmp = es.scroll(scroll_id=scrollId, scroll= "1m")
scrollId = response_tmp[''_scroll_id'']
El método de exploración de Python está generando una llamada GET a la API de descanso. Está intentando enviar su scroll_id a través de http. El caso más probable aquí es que su scroll_id es demasiado grande para ser enviado a través de http y, por lo tanto, está viendo este error porque no responde.
Debido a que scroll_id crece en función de la cantidad de fragmentos que tiene, es mejor usar un POST y enviar el scroll_id en JSON como parte de la solicitud. De esta manera, evita la limitación de que sea demasiado grande para una llamada http.