ElasticSearch通过经纬度进行距离排序的一个坑

  1. 做了一个小项目,因为要做全文检索和分词检索,使用mysql分词比较难实现,全文检索用like"%%"太慢了(再加上有联表查询就更慢了),所以选择增加一个elasticsearch6来做实现这两个需求。实现思路是:查询所有数据,然后将数据放到es中,该过程使用logstash实现;
  2. 在mysql中存在一个字段location记录地址的经纬度,例"39.904581,116.276554",代表纬度和经度。同步到es后,使用 curl -XGET ‘ip:9200/result/_mapping?pretty’ 查看索引,location的type识别为text,根据官方文档说明"地理坐标点不能被动态映射 (dynamic mapping)自动检测,而是需要显式声明对应字段类型为 geo-point"需要修改,否则使用java api调用会报错“org.elasticsearch.index.fielddata.plain.DoubleArrayIndexFieldData cannot be cast to org.elasticsearch.index.fielddata.IndexGeoPointFieldData”
     //下面是类型 
          "location" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },

  1. 按道理说直接修改location的属性直接修改类型就行了,但是从网上资料看修改是有限制的,可以查看后面的引用文章。
  2. 最后采用的解决方法是,把原来的所有delete掉了原来的索引,然后新建索引,将location设置type设置为geo_point:最后采用的解决方法是,把原来的所有delete掉了原来的索引,然后新建索引,将location设置type设置为geo_point。:
curl -XPUT --header "Content-Type:application/json" '47.107.40.230:9200/result' -d '{
  "mappings": {
    "doc": {
    "properties": {
     "location": {
         "type": "geo_point"
      }
      }
    }
  }
}'

然后使用logstash再次导入就正常了,使用curl -XGET ‘ip:9200/result/_mapping?pretty’ 显示如下:

          "location" : {
            "type" : "geo_point"
          },

相关文章:
Elasticsearch 的坑爹事——记录一次mapping field修改过程
ElasticSearch更新字段类型的具体解决办法(重要)
Elasticsearch 2.x 文档地理坐标点
Elasticsearch Reference [6.4]GeoShape Query
Elasticsearch Reference [6.4]Geo-point datatype
elasticsearch-CN
设置嵌套文档提示index已存在
https://github.com/elastic/elasticsearch/issues/9347

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值