如何使用至少一个多边形匹配的地理形状过滤器查询包含多边形数组的文档?

时间:2018-10-13 12:05:48

标签: elasticsearch elasticsearch-geo-shape

我有一个具有area属性的文档。此属性是一个多边形数组。假设多边形代表某些城市的边界。

鉴于我有一个边界框,我想查询那些在边界框内至少有一个多边形的文档。

如果有一个与过滤器匹配的区域,或者边界框太大,所有多边形都在其中,我的查询就会起作用。

{
   "query":{
      "bool":{
         "filter":[
            {
               "geo_shape":{
                  "areas":{
                     "shape":{
                        "type":"envelope",
                        "coordinates":[
                           [
                              20.9325116,
                              52.2280665
                           ],
                           [
                              21.0069884,
                              52.1928718
                           ]
                        ]
                     },
                     "relation":"within"
                  }
               }
            }
         ]
      }
   }
}

示例区域属性如下:

{
   "areas":[
      {
         "type":"polygon",
         "coordinates":[

         ]
      },
      {
         "type":"polygon",
         "coordinates":[

         ]
      }
   ]
}

1 个答案:

答案 0 :(得分:0)

我没有使用一个查询来解决这个问题,但是找到了解决方法。

我创建了一个附加索引,仅包含区域及其边界,第二个索引仅包含标识符。因此,我必须做两个查询,一个要获取符合我的条件的战神,另一个要获取主要文档。

这为我提供了编写更复杂查询的灵活性,而且,我没有重复出现某些情况下确实很大的多边形,眨眼间我的索引就超过了几GB。

第一个查询获取区域(这将匹配区域或整个城市,这就是为什么我使用包含或内部的原因):

{
   "query":{
      "bool":{
         "should":[
            {
               "geo_shape":{
                  "boundary":{
                     "shape":{
                        "type":"envelope",
                        "coordinates":[
                           [
                              20.5992053,
                              52.1227965
                           ],
                           [
                              20.6671965,
                              52.0876378
                           ]
                        ]
                     },
                     "relation":"contains"
                  }
               }
            },
            {
               "geo_shape":{
                  "boundary":{
                     "shape":{
                        "type":"envelope",
                        "coordinates":[
                           [
                              20.5992053,
                              52.1227965
                           ],
                           [
                              20.6671965,
                              52.0876378
                           ]
                        ]
                     },
                     "relation":"within"
                  }
               }
            }
         ],
         "minimum_should_match":1
      }
   }
}

第二次查询获取主要文档:

{
   "query":{
      "bool":{
         "filter":[
            {
               "terms":{
                  "areas":[9, 6]
               }
            }
         ]
      }
   }
}