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

你可能感兴趣的:(ElasticSearch)