原英文版地址: 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(默认值)时,如果字段未映射,查询将抛出异常。