首先必须安装了logstash并且有logstash-input-jdbc和logstash-output-elasticsearch这俩插件。
Elasticsearch 提供了 两种表示地理位置的方式:用纬度-经度表示的坐标点使用 geo_point 字段类型; 以 GeoJSON 格式定义的复杂地理形状,使用 geo_shape 字段类型。
这里我用的是geo_point的字段类型;这种字段类型有三种格式(官方例子):
1.
{
"name": "Chipotle Mexican Grill",
"location": "40.715, -74.011"
}
2.
{
"name": "Pala Pizza",
"location": {
"lat": 40.722,
"lon": -73.989
}
}
3.
{
"name": "Mini Munchies Pizza",
"location": [ -73.983, 40.719 ]
}
我使用的是第一种;
1.新建索引并且设置经纬度字段的类型为geo_point(我使用的是kibana的console):
PUT vehicle_locus
{
"mappings": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
2.编写logstash同步脚本:
logstash-mysql.conf
input {
stdin {}
jdbc {
type => "jdbc"
# MySQL的连接包是要自己下载的
jdbc_driver_library => "/opt/software/mysql-connector-java-5.1.46.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://localhost:3306/mp?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true"
jdbc_paging_enabled => "true"
jdbc_page_size => "2000"
jdbc_user => "root"
jdbc_password => "root"
#设置监听间隔 各字段含义(由左至右)分、时、天、月、年,全部为*为每分钟都更新 因为我只同步一次 所以注掉了
# schedule => "* * * * *"
jdbc_default_timezone => "Asia/Shanghai"
# 查询的sql语句
statement => "SELECT ID, CARDEVICEID, HISTLNG, HISTLAT, concat_ws(',', HISTLAT, HISTLNG) as gis, HISTSPEED, MILEAGE, CREATETIME, TRAILID, DUMPENERGY FROM vehicle_locus"
}
}
filter {
mutate {
# 转换经纬度坐标的字段类型
convert => { "HISTLNG" => "float" }
convert => { "HISTLAT" => "float" }
}
mutate {
rename => {
# 这里要注意一下 一定要lat在前 lon在后,因为es geo_point的格式就是[lat, lon]
"lat" => "[location][HISTLAT]"
"lon" => "[location][HISTLNG]"
}
}
}
output {
elasticsearch {
# ES的IP地址及端口
hosts => ["http://localhost:9200"]
# 索引名称 可自定义
index => "vehicle_locus"
# 需要关联的数据库中有有一个id字段,对应类型中的id
document_id => "%{id}"
document_type => "_doc"
}
stdout {
# JSON格式输出
codec => json_lines
}
}
一个注意的点:上边脚本中filter模块的第二个mutate中的rename中的配置;这个一定要lat在前,lon在后, 否则es解析经纬度坐标会报错:faild to parse field gis of type [geo_point]
然后在logstash的bin目录下执行
./logstash -f logstash-mysql.conf
logstash-mysql.conf文件我是放在bin目录下的。
同步数据完成后,使用kibana的console查询一下:
GET vehicle_locus/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "100m",
"gis": {
"lat": 39.77185,
"lon": 116.565704
}
}
}
}
}
}
返回: