[英]Elasticsearch JSON Bulk Indexing using Python
我在单个 JSON 中有大量数据,我想将其放入 Elasticsearch 以在 Kibana 中进行一些可视化。 我的 JSON 目前看起来有点像这样:
[{"field1": "x", "field2": "y"},
{"field1": "w", "field2": "z"}]
...etc
在做了一些研究之后,我发现将这些数据提供给 Elasticsearch 的最佳方法是使用 Bulk API,但首先我需要重新格式化我的数据,如下所示:
{"index":{"_index": "myindex", "type": "entity_type", "_id": 1}}
{"field1": "x", "field2": "y"}
{"index":{"_index": "myindex", "type": "entity_type", "_id": 2}}
{"field1": "w", "field2": "z"}
...etc
然后我必须使用 curl 发布这个文件。
所有这些都是一个更大的 Python 项目的一部分,所以我想知道重新格式化我的数据的最佳方法以及如何使用 Python 将其导入 Elasticsearch。 我想过使用正则表达式进行重新格式化(re.sub 和 replace),并且我还查看了 elasticsearch 批量帮助程序来发布数据,但我找不到解决方案。
非常感谢任何帮助,谢谢。
嗨!
根据https://elasticsearch-py.readthedocs.io/en/master/helpers.html#example ,python 库有几个用于bulk
操作的助手。
例如,对于您的情况,您可以使用以下代码:
def gendata():
docs = [{"field1": "x", "field2": "y"},{"field1": "w", "field2": "z"}]
for doc in docs:
yield {
"_op_type":"index",
"_index": "docs",
"_type": "_doc",
"doc": doc
}
bulk(es, gendata())
您当前的格式很好,前提是您可以在内存中加载 dict 列表。
但是,如果您无法在内存中加载整个文件,那么您可能需要将文件转换为新行分隔的 JSON
{"field1": "x", "field2": "y"}
{"field1": "w", "field2": "z"}
然后你应该逐行阅读并使用@banuj 建议的生成器。
另一个很好的例子可以在这里找到: https : //github.com/elastic/elasticsearch-py/blob/master/example/load.py#L76-L130
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.