欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-05 10:05:56
...
  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