在地理点的给定距离内匹配geo_point和geo_shape值。
示例
假设有如下索引:
PUT /my_locations
{
"mappings": {
"properties": {
"pin": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
}
}
PUT /my_locations/_doc/1
{
"pin": {
"location": {
"lat": 40.12,
"lon": -71.34
}
}
}
PUT /my_geoshapes
{
"mappings": {
"properties": {
"pin": {
"properties": {
"location": {
"type": "geo_shape"
}
}
}
}
}
}
PUT /my_geoshapes/_doc/1
{
"pin": {
"location": {
"type" : "polygon",
"coordinates" : [[[13.0 ,51.5], [15.0, 51.5], [15.0, 54.0], [13.0, 54.0], [13.0 ,51.5]]]
}
}
}
使用geo_distance过滤器匹配距离另一个地理点指定距离内的geo_point值
GET /my_locations/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "200km",
"pin.location": {
"lat": 40,
"lon": -70
}
}
}
}
}
}
使用相同的过滤器匹配给定距离内的geo_shape值:
GET my_geoshapes/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "200km",
"pin.location": {
"lat": 40,
"lon": -70
}
}
}
}
}
}
要匹配geo_point和geo_shape值,搜索这两个索引:
GET my_locations,my_geoshapes/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "200km",
"pin.location": {
"lat": 40,
"lon": -70
}
}
}
}
}
}
支持的格式
就像geo_point类型可以接受geo点的不同表示方式一样,过滤器也可以接受它:参照geo_bounding_box查询
查询选项
| 选项 | 说明 |
| distance | 以指定位置为中心的圆的半径。落入这个圆圈的点被认为是匹配的。距离可以用各种单位来表示,参照 Distance Units. |
| distance_type | 如何计算距离。可以是弧线(默认),也可以是平面(更快,但在长距离和接近极点时不准确)。 |
| _name | 可选名称字段来标识查询 |
| validation_method | 设置为IGNORE_MALFORMED以接受纬度或经度无效的地理点,设置为COERCE以额外尝试和推断正确的坐标(默认为STRICT)。 |
多位置文档
geo_distance过滤器可以处理每个文档的多个位置/点。一旦一个位置/点匹配过滤器,该文档将被包含在过滤器中。
忽略未映射的
当ignore_unmapped选项设置为true时,将忽略未映射字段,并且不会匹配此查询的任何文档。这在查询可能具有不同映射的多个索引时很有用。当设置为false(默认值)时,如果该字段没有映射,查询将抛出异常。
这篇博客介绍了如何在Elasticsearch中使用geo_distance过滤器来匹配`geo_point`和`geo_shape`类型的数据。通过示例展示了如何在索引`my_locations`和`my_geoshapes`中查询距离特定地理点200公里内的点和形状。同时,还提到了过滤器的多种支持格式和查询选项,如距离单位、距离类型以及处理多位置文档的能力。此外,还讨论了如何处理未映射字段的情况和查询性能的考虑。
4188

被折叠的 条评论
为什么被折叠?



