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

Elasticsearch(021):es常见的字段映射类型之地理点类型(geo-point)

程序员文章站 2022-04-23 15:46:32
...

概念

大家平时肯定经常美团、饿了吗类似的外卖软件。她其中最常见的功能就是附件的商家的功能。她这功能就能借助es来实现。

es中的地理位置数据类型:该类型的字段接受经纬度对,进行使用。

常见的使用场景

  • 在边界框内,中心点一定距离内或多边形内找到地理点
  • 地理位置或距中心点的距离汇总文档
  • 将距离整合到文档的相关性分数中
  • 距离对文档进行排序

示例使用

1、映射定义示例如下。

PUT example
PUT example/docs/_mapping
{
    "properties":{
        "cityId":{"type": "long"},
        "cityName":{"type": "text"},
        "location":{"type": "geo_point"},
        "remark":{"type": "text"}
    }
}

2、新增文档示例如下。

PUT example/docs/1
{
    "cityId":1,
    "cityName":"xi'an",
    "location": {
        "lat":"34.45",
        "lon":"107.40"
    },
    "remark":"中国旅游城市"

}

PUT example/docs/2
{
    "cityId":2,
    "cityName":"Singapore",
    "location": "1.05,104.60",
    "remark":"世界港口"
}

PUT example/docs/3
{
    "cityId":3,
    "cityName":"Sydney",
    "location": [151.12, -33.51],
    "remark":"澳洲大城"
}

2、搜索示例如下。

我们可以看得出来,geo_point类型的字段有至少有三种形式的添加方式。

  • latlon键表示为对象的地理位置
  • 以字符串形式表示的地理位置,格式为:"lat,lon"
  • 表示为数组的地理位置,格式为:[lon,lat]

测试数据已经添加进去,搜索时怎么使用呢。如下

我们假设这样一个需求,搜索在指定经纬度区域的城市有哪些?

GET example/docs/_search
{
    "query":{
        "geo_bounding_box": {
            "location":{
                "top_left":{
                    "lat": 50,
                    "lon": 110
                },
                "bottom_right":{
                    "lat": -40,
                    "lon": 179
                }
            }
        }
    }
}

有关geo-point的搜索后面会有专门的小节来讲解。我们在这里重点在于理解geo-point类型的定义和基础用法。