1

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

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

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

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

         ]
      }
   ]
}
4

1 回答 1

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]
               }
            }
         ]
      }
   }
}
于 2018-10-14T10:32:34.410 回答