es7 geo_point 类型搜索

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

猜你喜欢

转载自blog.csdn.net/lxw1844912514/article/details/130156381
ES7
今日推荐