我有一个具有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":[
]
}
]
}
答案 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]
}
}
]
}
}
}