Elasticsearch 入门: _bulk 批量导入数据

批量导入数据

使用 Elasticsearch Bulk API /_bulk批量 update

步骤:
  1. 需求:我希望批量导入一个 movie type 的名词列表到 wordbank index 索引。
  2. 准备数据: 根据官方文档,Json 数据要准备成这个格式的: action_and_meta_data\n optional_source\n action_and_meta_data\n optional_source\n .... action_and_meta_data\n optional_source\n 其中 action 需要是 index, create, delete and update 中的一个。 接下来准备这样的数据: {"index": {"_index": "wordbank", "_type": "movie", "_id": 1}} {"doc": {"name": "权力的游戏"}} {"index": {"_index": "wordbank", "_type": "movie", "_id": 2}} {"doc": {"name": "熊出没"}}
  3. POST bulk curl -X POST "localhost:9200/_bulk" -H 'Content-Type: application/json' --data-binary @movie_names
  4. 批量 update 成功 {"took":50,"errors":false,"items":[{"index":{"_index":"wordbank","_type":"movie","_id":"1","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1,"status":201}},{"index":{"_index":"wordbank","_type":"movie","_id":"2","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1,"status":201}}]}
遇到过的坑:
  1. illegal_argument_exception: {"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"The bulk request must be terminated by a newline [\n]"}],"type":"illegal_argument_exception","reason":"The bulk request must be terminated by a newline [\n]"},"status":400}
    • 原因:批量导入的 json 文件最后必须要以\n结尾,也就是需要一个空行。
    • 解决:在 json 文件末尾加多一个回车。
  2. header 问题: {"error":"Content-Type header [application/x-www-form-urlencoded] is not supported","status":406}
    • 原因:Elasticsearch 6.x 之后 curl 的 content-type 更严格了。
    • 解决:在 curl 命令后多加一条 -H 'Content-Type: application/json'
  3. action_request_validation_exception: {"error":{"root_cause":[{"type":"action_request_validation_exception","reason":"Validation Failed: 1: script or doc is missing;2: script or doc is missing;"}],"type":"action_request_validation_exception","reason":"Validation Failed: 1: script or doc is missing;2: script or doc is missing;"},"status":400}
    • 原因:bulk update 时,更新的文本需要放到 "doc" 字典下,另外 update 在这里就只是 update,如果文档不存在会报错。
    • 解决:

    { "field1" : "value1", "field2" : "value2" } --> { "doc" : { "field1" : "value1", "field2" : "value2" } }

  4. 不要直接在 terminal 把 curl 的结果显示出来
    • 原因:因为 curl 返回的结果是个单行 json 当批量处理条目多的时候,这个单行的 json 很长。而且-s 也silent 模式是不会把这个结果去掉的,因为 -s 是 curl 的参数,会屏蔽掉 curl 的 log,但 Elasticsearch 的返回 json 是不会被屏蔽掉的。
    • 解决:把输出结果导到文件 curl -s 'http://example.com' > /dev/null
  5. 据说不要重复指定 index 和 type:来源,可能是我数据量比较小,2w条,差距不大。不过前者确实省文档空间。 推荐使用这种: POST /website/log/_bulk { "index": {}} { "event": "User logged in" } 而不是这种: POST /_bulk { "index": { "_index": "website" , "_type": "blog" , }} { "title": "Overriding the default type" }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

WAF绕过技巧浅谈

远程命令执行漏洞是Web应用中常见的漏洞之一,在2017年发布的10项最严重的Web应用程序安全风险列表中”注入“毫不意外的被放在了第一位。 当不可信数据作为命...

37410
来自专栏北京马哥教育

那些吓人的 Linux 命令

哪些Linux命令会让人联想到妖魔鬼怪?不妨好好瞧一瞧! ? 每年一度的万圣节马上就要到来,是时候稍微关注一下Linux那吓人的一面了。哪些Linux命令会让...

3988
来自专栏FreeBuf

Linux Rootkit系列一:LKM的基础编写及隐藏

免责声明:本文介绍的安全知识方法以及代码仅用于渗透测试及安全教学使用,禁止任何非法用途,后果自负 前言:作者最近在学习有关linux rootkit的原理与防范...

32610
来自专栏FreeBuf

Java反序列化漏洞:在受限环境中从漏洞发现到获取反向Shell

Java反序列化漏洞可以说是Java安全的一块心病,近年来更是在安全界“出尽风头”。其实说到Java反序列化的问题,早在2015年年初的在AppSecCali大...

982
来自专栏娱乐心理测试

小程序的网络请求封装

5477
来自专栏张善友的专栏

使用 MEF 轻松实现云部署

Joseph Fultz Chris Mabry 下载代码示例 ? 过去几个月中,我和一位同事一直在从事一个利用 Microsoft Extensibilit...

2137
来自专栏SDNLAB

如何向OpenDaylight社区贡献代码

本文由两部分构成,第一部分简要介绍了Gerrit的工作原理以工作流程,第二部分结合自己成功提交代码的例子,向大家展示向OpenDaylight提交源码的过程。向...

3709
来自专栏开发之途

Android IPC机制(1)-序列化机制

1455
来自专栏java思维导图

Java中高级面试题部分答案解析(4)

这里选了几道高频面试题以及一些解答。不一定全部正确,有一些是没有固定答案的,如果发现有错误的欢迎纠正,如果有更好的回答,热烈欢迎留言探讨。

1233
来自专栏PHP在线

CI一些优秀实践

最近准备接手改进一个别人用Codeigniter写的项目,虽然之前也有用过CI,但是是完全按着自己的意思写的,没按CI的一些套路。用在公众的项目,最好还是按框架...

3465

扫码关注云+社区