一、前言
在前面几章,基本把本地的环境给配置好了,那么配置好了之后,要做的第一件事当然就是导入数据进去。我这边准备的是一份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"
我这里没有明确指定index
和type
的值,因为我的数据中已经包含index
和type
,所以不在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
可以是index
,create
,delete
,和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
的值,第一次插入的时候,显示status
是201
,不过还是可以查询到已经导入的数据。第二次导入的时候,因为已经存在这个数据了,所以status
是200
。这里可以看到我的version
是3
,代表我这是第三次导入了,纯粹为了测试,哈哈。
需要注意的是,bulk
导入数据量是有限的,貌似是100M
是默认的上限,所以对于大数据量来说,使用logstash
导入更为合适(这里不讨论filebeat
相关,仅为引出下一篇文章),因此下一篇将介绍使用logstash
导入大量数据,以避免再遇到这种错误情况。
链接: logstash导入数据到Elasticsearch
end