elasticsearch - 如何查询包含具有至少一个多边形匹配地理形状过滤器的多边形数组的文档?
问题描述
我有一个带有区域属性的文件。该属性是一个多边形数组。假设多边形代表某些城市的边界。
鉴于我有一个边界框,我想查询那些在边界框中至少有一个多边形的文档。
如果有一个与过滤器匹配的区域或边界框太大,所有多边形都在其中,我的查询有效。
{
"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":[
]
}
]
}
解决方案
我没有设法使用单个查询来解决这个问题,但我找到了一种解决方法。
我创建了一个仅包含区域及其边界的附加索引,第二个索引仅包含标识符。所以我必须做两个查询,一个是获取匹配我的条件的,另一个是获取主文档。
这让我可以灵活地编写更复杂的查询,并且作为奖励,我不会复制在某些情况下可能非常大的多边形,从而导致我的索引在眨眼间增长超过几 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]
}
}
]
}
}
}
推荐阅读
- cypress - Cypress 通过 aria 角色获取元素
- c# - 尝试使用 protobuf-net 序列化 System.Numerics.Quaternion
- css - 在 React Material UI 表中突出显示 React Material UI TextField “Cell”?
- javascript - 如何将字符串中的数字(无论位数)转换为特定的字符集?
- azure - 如何让 terraform 自动导入所有“已经存在”的资源?
- firebase - 使用 Firebase 使用与 Google 相同的帐户处理 facebook 登录
- r - 包不会通过 RStudio 安装
- php - 使用 AWS PHP SDK 3.x 时,是否可以使用 getCommand 数组将多部分文件并行批量上传到 S3?
- google-analytics - “货币显示为”不会更新 Google Analytics(分析)电子商务报告中的先前数据
- r - 用于创建具有用户指定日期范围和个人的图表的闪亮应用程序