原英文版地址: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/query-dsl-geo-distance-query.html, 原文档版权归 www.elastic.co 所有
本地英文版地址: ../en/query-dsl-geo-distance-query.html
本地英文版地址: ../en/query-dsl-geo-distance-query.html
重要: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 当前版本文档。
过滤仅包含与一个地理位置坐标在指定距离内匹配的文档。假设有以下映射和索引文档:
PUT /my_locations { "mappings": { "properties": { "pin": { "properties": { "location": { "type": "geo_point" } } } } } } PUT /my_locations/_doc/1 { "pin" : { "location" : { "lat" : 40.12, "lon" : -71.34 } } }
然后,可以使用geo_distance
过滤器执行下面这个简单的查询:
GET /my_locations/_search { "query": { "bool" : { "must" : { "match_all" : {} }, "filter" : { "geo_distance" : { "distance" : "200km", "pin.location" : { "lat" : 40, "lon" : -70 } } } } } }
接受的格式
与geo_point
类型可以接受地理坐标点的不同表示方式非常相似,过滤器也可以接受它:
作为 lat lon 属性
GET /my_locations/_search { "query": { "bool" : { "must" : { "match_all" : {} }, "filter" : { "geo_distance" : { "distance" : "12km", "pin.location" : { "lat" : 40, "lon" : -70 } } } } } }
作为 lat lon 数组
格式为[lon, lat]
,注意,此处 lon/lat 的顺序是为了符合GeoJSON。
GET /my_locations/_search { "query": { "bool" : { "must" : { "match_all" : {} }, "filter" : { "geo_distance" : { "distance" : "12km", "pin.location" : [-70, 40] } } } } }
作为 lat lon 字符串
格式为lat,lon
。
GET /my_locations/_search { "query": { "bool" : { "must" : { "match_all" : {} }, "filter" : { "geo_distance" : { "distance" : "12km", "pin.location" : "40,-70" } } } } }
geohash
GET /my_locations/_search { "query": { "bool" : { "must" : { "match_all" : {} }, "filter" : { "geo_distance" : { "distance" : "12km", "pin.location" : "drm3btev3e86" } } } } }
选项
以下是过滤器上允许的选项:
|
以指定位置为圆心的圆的半径。
落入这个圆内的点被认为是匹配的。
可以用各种单位指定 |
|
如何计算距离。可以是 |
|
可选,用来标识查询名称的字段。 |
|
设置为 |
geo_point 类型
过滤器要求在相关字段中设置geo_point
类型。
一个文档包含多个位置
geo_distance
过滤器可以处理每个文档的多个位置/坐标点。
一旦单个位置/坐标点与过滤器匹配,该文档就将包含在过滤器中。
忽略未映射的字段 (ignore unmapped)
如果ignore_unmapped
选项设置为true
,将忽略未映射的字段,并且此查询不会匹配任何文档。
这在查询可能具有不同映射的多个索引时非常有用。
当设置为false
(默认值)时,如果字段未映射,查询将抛出异常。