Indice un marco de datos de pandas en Elasticsearch sin elasticsearch-py

Me gustaría indexar un montón de marcos de datos de pandas grandes (algunos millones de filas y 50 columnas) en Elasticsearch.

Al buscar ejemplos sobre cómo hacer esto, la mayoría de las personas usaránmétodo de ayuda masiva de elasticsearch-py, pasando una instanciade la clase Elasticsearch que maneja la conexión, así como una lista de diccionarios que se creacon el método pandas 'dataframe.to_dict (orient =' records '). Los metadatos se pueden insertar en el marco de datos de antemano como nuevas columnas, p.df['_index'] = 'my_index' etc.

Sin embargo, tengo razones para no usar la biblioteca elasticsearch-py y me gustaría hablar con elAPI masiva de Elasticsearch directamente, p. víapeticiones u otra conveniente biblioteca HTTP. Además,df.to_dict() desafortunadamente, es muy lento en grandes marcos de datos, y convertir un marco de datos en una lista de dictos que luego se serializa a JSON por elasticsearch-py suena como una sobrecarga innecesaria cuando hay algo comodataframe.to_json () que es bastante rápido incluso en grandes marcos de datos.

¿Cuál sería un enfoque fácil y rápido para obtener un marco de datos de pandas en el formato requerido por la API masiva? Creo que un paso en la dirección correcta es usardataframe.to_json() como sigue:

import pandas as pd
df = pd.DataFrame.from_records([{'a': 1, 'b': 2}, {'a': 3, 'b': 4}, {'a': 5, 'b': 6}])
df
   a  b
0  1  2
1  3  4
2  5  6
df.to_json(orient='records', lines=True)
'{"a":1,"b":2}\n{"a":3,"b":4}\n{"a":5,"b":6}'

Esta es ahora una cadena JSON separada por una nueva línea, sin embargo, todavía carece de metadatos. ¿Cuál sería una forma de lograrlo?

editar: Para completar, un documento JSON de metadatos se vería así:

{"index": {"_index": "my_index", "_type": "my_type"}}

Por lo tanto, al final, todo el JSON esperado por la API masiva se vería así (con un salto de línea adicional después de la última línea):

{"index": {"_index": "my_index", "_type": "my_type"}}
{"a":1,"b":2}
{"index": {"_index": "my_index", "_type": "my_type"}}
{"a":3,"b":4}
{"index": {"_index": "my_index", "_type": "my_type"}}
{"a":5,"b":6}

Respuestas a la pregunta(2)

Su respuesta a la pregunta