学而实习之 不亦乐乎

Elasticsearch 导入数据

2024-02-25 20:40:54

一、导入 JSON 数据文件

1、准备 JSON 数据

Elasticsearch 导入 JSON 数据文件时,JSON 文件的内容须以行作为分割,不能添加换行符(\n)以外的字符,且每两行作为一条文档,第一行的 _index 指明索引,_id 指明该条文档的id;第二行为具体的数据内容。如下(test.json)内容:

{"index":{"_index":"index2","_type":"type2","_id":0}}
{"age":10,"name":"jim"}
{"index":{"_index":"index2","_type":"type2","_id":1}}
{"age":16,"name":"tom"}

2、使用 _bulk 命令

_bulk API 导入的 JSON 文件需要 1 中的格式。执行如下的命令:

$ curl -H 'Content-Type: application/x-ndjson' -s -XPOST localhost:9200/_bulk --data-binary @test.json

如果是在 test.json 文件中没有指定 index、type、id 时:

$ curl -H 'Content-Type: application/x-ndjson'  -s -XPOST localhost:9200/index2/type2/_bulk --data-binary @test.json

{ "index" : { } }
{"age":16,"name":"tom"}

此时id会自动生成。

此方法导入数据可借助工具,如 postman、Kibana等工具进行导入。使用 postman 发送 Http 请求的方式进行操作,具体方法不再缀述;在 Kibana 的 Dev-Tools -> Console 下也可以 _bulk API 进行操作。

二、Kibana 导入文件

该方法的 JSON 数据文件不需要添加索引和文档 id 等信息,只需要数据内容即可。如下数据:

{"name_ch": "阿贝数","name_en": "Abbe number","explain": "即倒色散系数见平均色散。"}
{"name_ch": "阿克隆磨耗试验","name_en": "Akron abrasion test","explain": "阿克隆磨耗机属于滚动式磨托机。"}
{"name_ch": "阿里特","name_en": "Alite C3S","explain": "是硅酸盐水泥中最主要的矿物成分"}
{"name_ch": "阿隆陶瓷","name_en": "ALON ceramics","explain": "氧氮化铝尖晶石体是唯..."}
{"name_ch": "阿米巴效应","name_en": "Amoeba effect","explain": "包覆燃料颗粒的核芯由低温侧向高温侧迁移的现象。"}
{"name_ch": "阿姆科铁","name_en": "Armco-iron","explain": "见工业纯铁(250页)"}

在 integrations -> Upload file,然后选择需要导入的 .json 文件,即可导入数据。

三、logstash 导入

1、导入 JSON 文件

对于普通 JSON 文件的导入,可以通过 logstash 进行导入,如下 JSON 数据(data.json):

{"age":16,"name":"tom"}
{"age":11,"name":"tsd"}

创建配置文件(json.conf):

input{
        file{
                path=>"/mnt/data.json"
                start_position=>"beginning"
                sincedb_path=>"/dev/null"
                codec=>json{
                        charset=>"ISO-8859-1"
                }
        }
}
output{
        elasticsearch{
                hosts=>"http://192.168.200.100:9200"
                index=>"jsontestlogstash"
                document_type=>"doc"
        }
        stdout{}
}

执行

$ ./logstash -f json.conf
[2019-04-25T10:59:14,803][INFO ][logstash.agent ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2019-04-25T10:59:16,084][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
{
    "name" => "tom",
    "age" => 16,
    "path" => "/mnt/data.json",
    "@timestamp" => 2019-04-25T02:59:16.009Z,
    "host" => "master",
    "@version" => "1"
}
{
    "name" => "tsd",
    "age" => 11,
    "path" => "/mnt/data.json",
    "@timestamp" => 2019-04-25T02:59:16.096Z,
    "host" => "master",
    "@version" => "1"
}

从结果中可以看到:默认增加了几个字段。那么我们想要这几个默认生成的字段我们应该怎么么办呢,可以如下解决:

在配置文件中使用filter进行过滤:

$ cat json.conf
input{
        file{
                path=>"/mnt/data.json"
                start_position=>"beginning"
                sincedb_path=>"/dev/null"
                codec=>json{
                        charset=>"ISO-8859-1"
                }
        }
}
filter{
        mutate {
                remove_field => "@timestamp"
                remove_field => "@version"
                remove_field => "host"
                remove_field => "path"
        }
}
output{
        elasticsearch{
                hosts=>"http://192.168.200.100:9200"
                index=>"jsontestlogstash"
                document_type=>"doc"
        }
        stdout{}
}

2、导入csv文件

【1】上传logstash-6.4.0.tar.gz包,解压。

# tar -zxvf logstash-5.6.3.tar.gz -C /home/elasticsearch/

【2】修改logstash配置文件

input {
        file {
                path => ["/home/elasticsearch/data.csv"]
                start_position => "beginning"
        }
}
filter {
        csv {
                separator => ","
                columns => ["cluster","storageRate","resourceRrate","object"]
        } 
}
output {
        elasticsearch {
                hosts => ["192.168.20.20:9200"]
                index => "es_data"
        }
}

【3】上传csv数据文件

/home/elasticsearch/data.csv

【4】执行命令,进行数据导入

# /home/elasticsearch/logstash-6.4.0/bin/logstash -f /home/elasticsearch/import.conf

【5】页面查看数据(默认显示10条)

http://192.168.20.20:9200/es_data/_search