1.地理坐标查询
所谓的地理坐标查询,其实就是根据经纬度查询,官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/geo-queries.html
常见的使用场景包括:
携程:搜索我附近的酒店
滴滴:搜索我附近的出租车
微信:搜索我附近的人
附近的酒店
附近的车
2.矩形范围查询
矩形范围查询,也就是geo_bounding_box查询,查询坐标落在某个矩形范围的所有文档
查询时,需要指定矩形的左上、右下两个点的坐标,然后画出一个矩形,落在该矩形内的都是符合条件的点。
语法如下:
// geo_bounding_box查询
GET /indexName/_search
{
"query": {
"geo_bounding_box": {
"FIELD": {
"top_left": { // 左上点
"lat": 31.1,
"lon": 121.5
},
"bottom_right": { // 右下点
"lat": 30.9,
"lon": 121.7
}
}
}
}
}
3.附近查询
附近查询,也叫做距离查询(geo_distance):查询到指定中心点小于某个距离值的所有文档。
换句话来说,在地图上找一个点作为圆心,以指定距离为半径,画一个圆,落在圆内的坐标都算符合条件
语法说明:
// geo_distance 查询
GET /indexName/_search
{
"query": {
"geo_distance": {
"distance": "15km", // 半径
"FIELD": "31.21,121.5" // 圆心
}
}
}
bool查询有几种逻辑关系?
- must:必须匹配的条件,可以理解为“与”
- should:选择性匹配的条件,可以理解为“或”
- must_not:必须不匹配的条件,不参与打分
- filter:必须匹配的条件,不参与打分
4.地理坐标排序
地理坐标排序略有不同。
语法说明:
GET /indexName/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"_geo_distance" : {
"FIELD" : "纬度,经度", // 文档中geo_point类型的字段名、目标坐标点
"order" : "asc", // 排序方式
"unit" : "km" // 排序的距离单位
}
}
]
}
这个查询的含义是:
指定一个坐标,作为目标点
计算每一个文档中,指定字段(必须是geo_point类型)的坐标 到目标点的距离是多少
根据距离排序
5.测试
5.1创建语句
PUT geo
{
"mappings": {
"properties": {
"name":{
"type": "keyword"
},
"location":{
"type": "geo_point"
}
}
}
}
其中 location字段的分词器类型为 geo_point, 这样就可以对地理相关的的数据进行操作, geo是地理的geographic单词缩写, 当为这个类型时数据格式为 "经度, 纬度"
5.2geo_distance :查询距离一个经纬点指定距离范围内的其它数据
geo_distance query可以查找在一个中心点指定范围内的地理点文档
GET geo/_search
{
"query": {
"bool": {
"must": [
{
"match_all": {}
}
],
"filter": [
{
"geo_distance": {
"distance": "200km",
"location": {
"lat": 39.08,
"lon": 117.19
}
}
}
]
}
}
}
在查询的时候用的是filter
查询,在filter查询里再使用geo_distance
查询,我们定义距离distance
查询距离位置点 lat(经度), lon(纬度) 200km的文档数据, 查询语句中的位置为天津, 最后得到结果为北京按距离查询经纬点的远近排序
GET geo/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"_geo_distance": {
"location": "39.9088145109,116.3973999023",
"unit": "km"
}
}
]
}
5.3 geo_bounding_box query 矩形范围查询
geo_bounding_box query用于查找落入指定的矩形内的地理坐标。查询中由两个点确定一个矩形
GET geo/_search
{
"query": {
"bool": {
"must": [
{"match_all": {}}
],
"filter": [
{"geo_bounding_box": {
"location": {
"top_left": {
"lat": 38.48,
"lon": 106.23
},
"bottom_right": {
"lat": 28.68,
"lon": 115.85
}
}
}}
]
}
}
}
查询语句就如图片一样, geo_bounding_box 表示一个方框, 传入左上和右下两个坐标点确定一个矩形, 查出的结果就是 西安和郑州
5.4geo_polygon query 多边形范围内查询
这种是多个点确定一个图形范围, 不仅仅是三角形, 图片是三角形, N边形都可以
GET geo/_search
{
"query": {
"bool": {
"must": [
{
"match_all": {}
}
],
"filter": [
{
"geo_polygon": {
"location": {
"points": [
{
"lat": 40.84,
"lon": 111.75
},
{
"lat": 29.56,
"lon": 106.55
},
{
"lat": 31.23,
"lon": 121.47
}
]
}
}
}
]
}
}
}
查出来的结果为 西安和郑州
参考:https://blog.csdn.net/weixin_66490956/article/details/128006523
https://blog.csdn.net/weixin_43918355/article/details/118366065