Индексировать пандас-фрейм данных в Elasticsearch без эластичного поиска
Я хотел бы проиндексировать кучу больших фреймов данных панд (несколько миллионов строк и 50 столбцов) в Elasticsearch.
При поиске примеров того, как это сделать, большинство людей будут использоватьМетод массового помощника эластичного поиска-pyпередавая экземпляркласса Elasticsearch который обрабатывает соединение, а также список словарей, который создаетсяс помощью метода pandas dataframe.to_dict (orient = 'records'), Метаданные могут быть заранее вставлены в кадр данных в виде новых столбцов, например,df['_index'] = 'my_index'
и т.п.
Однако у меня есть причины не использовать библиотекуasticsearch-py, и я хотел бы поговорить сElasticsearch навальный API непосредственно, например с помощьюЗапросы или другую удобную библиотеку HTTP. Кроме того,df.to_dict()
К сожалению, на больших фреймах данных происходит очень медленно, и конвертирование фрейма данных в список диктов, который затем сериализуется в JSON с помощьюластиком упругости поиска, звучит как ненужные издержки, когда есть что-то вродеdataframe.to_json () что довольно быстро даже на больших фреймах данных.
Каким будет простой и быстрый способ перевода кадра данных pandas в формат, необходимый для массового API? Я думаю, что шаг в правильном направлении используетdataframe.to_json()
следующее:
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}'
Теперь это строка JSON, разделенная символом новой строки, однако в ней по-прежнему отсутствуют метаданные. Каков был бы эффективный способ получить это там?
редактировать: Для полноты документ JSON метаданных будет выглядеть так:
{"index": {"_index": "my_index", "_type": "my_type"}}
Следовательно, в итоге весь JSON, ожидаемый массовым API, будет выглядеть следующим образом (с дополнительным переводом строки после последней строки):
{"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}