使用Logstash将MySQL经纬度数据转换为es geo同步到Elasticsearch以及遇到的问题

首先必须安装了logstash并且有logstash-input-jdbclogstash-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
                    }
                }
            }
        }
    }
}

返回:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值