在Elasticsearch中插入多个文档

5

你是用什么客户端语言读取JSON文件的? - Val
它在我的机器上。我正在使用curl从命令行开始使用弹性。 - Forkmohit
你能展示一下你的JSON文件的摘录吗? - Val
@Val 更新了问题。 - Forkmohit
@Val 是的,谢谢。我稍微修改了一下以适应我的情况。 - Forkmohit
1个回答

9
好的,那么您可以使用一个简单的shell脚本(见下文)来完成一些相对简单的操作。其思想是不必手动编辑文件,而是让Python处理并创建另一个符合_bulk端点所需格式的文件。它执行以下操作:
  1. 首先,我们声明一个小型Python脚本,该脚本读取您的JSON文件,并创建一个新文件,使其符合发送到_bulk端点的要求。
  2. 然后,我们运行该Python脚本并存储批量文件。
  3. 最后,我们使用一个简单的curl命令将步骤2中创建的文件发送到_bulk端点。
  4. 这样,您现在就拥有了一个包含您的文档的新ES索引。

bulk.sh:

#!/bin/sh

# 0. Some constants to re-define to match your environment
ES_HOST=localhost:9200
JSON_FILE_IN=/path/to/your/file.json
JSON_FILE_OUT=/path/to/your/bulk.json

# 1. Python code to transform your JSON file
PYTHON="import json,sys;
out = open('$JSON_FILE_OUT', 'w');
with open('$JSON_FILE_IN') as json_in:
    docs = json.loads(json_in.read());
    for doc in docs:
        out.write('%s\n' % json.dumps({'index': {}}));
        out.write('%s\n' % json.dumps(doc, indent=0).replace('\n', ''));
"

# 2. run the Python script from step 1
python -c "$PYTHON"

# 3. use the output file from step 2 in the curl command
curl -s -XPOST $ES_HOST/index/type/_bulk --data-binary @$JSON_FILE_OUT

您需要做以下事情:

  1. 将上述脚本保存在 bulk.sh 文件中并进行 chmod (即 chmod u+x bulk.sh)
  2. 修改顶部的三个变量(步骤 0),以便与您的环境相匹配
  3. 使用 ./bulk.sh 运行它

对于最近版本的Elasticsearch,您需要在curl请求中添加内容类型,使用-H 'Content-Type: application/x-ndjson' - Raphaël
我知道这个帖子现在相当古老了,但是有一个问题。每当我在我的 JSON 文件上使用它时,它会在每个字符处添加一个索引字符串。还有其他人遇到这个问题吗?你是如何解决的? - Christopher Adkins
@ChristopherAdkins 可以放心地创建一个新问题,引用这个问题并详细说明您的问题。 - Val
@val 发布了一个新问题,https://dev59.com/ibroa4cB1Zd3GeqPqcB5 - Christopher Adkins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接