概念
大家平时肯定经常美团、饿了吗类似的外卖软件。她其中最常见的功能就是附件的商家的功能。她这功能就能借助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
类型的字段有至少有三种形式的添加方式。
- 用
lat
和lon
键表示为对象的地理位置 - 以字符串形式表示的地理位置,格式为:"
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
类型的定义和基础用法。