导入json数据到Elasticsearch(bulk方法)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LJFPHP/article/details/89340245

一、前言

      在前面几章,基本把本地的环境给配置好了,那么配置好了之后,要做的第一件事当然就是导入数据进去。我这边准备的是一份json数据,这里通过ES的bulk API给导入进去。

二、导入数据

1、批量导入的话使用bulk API,形如:

curl -H "Content-Type: application/x-ndjson"  -s -XPOST "localhost:9200/_bulk?pretty&refresh" --data-binary "@E:\files\es_zeusa.evony.com.accesslog\test.json"

      我这里没有明确指定indextype的值,因为我的数据中已经包含indextype,所以不在url中指定也可以。指定的话,格式是:

{index}/{type}/_bulk
pretty:pretty是将返回的信息以可读的JSON形式返回

2、报错

"error" : {
"root_cause" : [
  {
    "type" : "illegal_argument_exception",
    "reason" : "Malformed action/metadata line [1], expected START_OBJECT or END_OBJECT but found [VALUE_STRING]"
  }

百度了一下,说是导入的json数据没有id的问题,但问题是,我有id的。导入的js文件类似于:

{"_index":"xxx","_type":"doc","_id":"OCCZwwB18T8lllql35ykE","_score":1,"_source":{"fields":{"service":"zeusa.evony.com.accesslog"}}

有id的,只不过这个id不是自增长的id,是ES自动生成的id,没道理啊。

3、参照bulk的文档:

https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html

action_and_meta_data \ n
optional_source \ n
action_and_meta_data \ n
optional_source \ n

这是标准格式,action可以是indexcreatedelete,和update
option是相关参数属性

修改格式形如:

{"index":{"_index":"xxx","_type":"doc","_id":"OCCxxxxxxxxxxxx5ykE"}}
{"doc":{"_score":1,"_source":{"fields":{"service":"xxxx"}}

百度一下,看到很多人导入的格式是类似于这样的,给json文件一个顶级对象,严格安装bulk API的要求。

4、继续导入,报错:

 "error" : {
"root_cause" : [
  {
    "type" : "illegal_argument_exception",
    "reason" : "The bulk request must be terminated by a newline [\n]"
  }
]}

      这个错误比较明显,是没加换行符。需要在json文件的结尾加个换行符,也就是按一下enter,切换到下一行。重新输入:

"took" : 114,
  "errors" : false,
  "items" : [
    {
      "index" : {
        "_index" : "xxx",
        "_type" : "doc",
        "_id" : "xxxx",
        "_version" : 3,
        "result" : "updated",
        "forced_refresh" : true,
        "_shards" : {
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 3,
        "_primary_term" : 1,
        "status" : 200    
      }
    }]

      导入成功。这里注意下status的值,第一次插入的时候,显示status201,不过还是可以查询到已经导入的数据。第二次导入的时候,因为已经存在这个数据了,所以status200。这里可以看到我的version3,代表我这是第三次导入了,纯粹为了测试,哈哈。

      需要注意的是,bulk导入数据量是有限的,貌似是100M是默认的上限,所以对于大数据量来说,使用logstash导入更为合适(这里不讨论filebeat相关,仅为引出下一篇文章),因此下一篇将介绍使用logstash导入大量数据,以避免再遇到这种错误情况。
链接: logstash导入数据到Elasticsearch

end

猜你喜欢

转载自blog.csdn.net/LJFPHP/article/details/89340245
今日推荐