首页 > 解决方案 > 如何查询包含具有至少一个多边形匹配地理形状过滤器的多边形数组的文档?

问题描述

我有一个带有区域属性的文件。该属性是一个多边形数组。假设多边形代表某些城市的边界。

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

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

{
   "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":[

         ]
      }
   ]
}

标签: elasticsearchelasticsearch-geo-shape

解决方案


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

我创建了一个仅包含区域及其边界的附加索引,第二个索引仅包含标识符。所以我必须做两个查询,一个是获取匹配我的条件的,另一个是获取主文档。

这让我可以灵活地编写更复杂的查询,并且作为奖励,我不会复制在某些情况下可能非常大的多边形,从而导致我的索引在眨眼间增长超过几 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]
               }
            }
         ]
      }
   }
}

推荐阅读