Как запросить документы, содержащие массив полигонов с хотя бы одним полигональным фильтром геоформ?
У меня есть документ с областями собственности. Это свойство является массивом полигонов. Скажем, полигоны представляют границы некоторых городов.
Учитывая, что у меня есть ограничивающий прямоугольник, я хочу запросить те документы, у которых есть хотя бы один из полигонов В пределах ограничивающего прямоугольника.
Мой запрос работает, если существует одна область, соответствующая фильтру, или ограничивающий прямоугольник настолько велик, что все полигоны находятся внутри него.
{
"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 ответ
Мне не удалось решить эту проблему с помощью одного запроса, но я нашел обходной путь.
Я создал дополнительный индекс, содержащий только области и их границы, а второй индекс содержит только идентификаторы. Поэтому мне нужно сделать два запроса: один для выборки, соответствующей моим критериям, а другой для получения основных документов.
Это дало мне гибкость при написании более сложных запросов, и в качестве бонуса я не дублирую многоугольники, которые в некоторых случаях могут быть очень большими, в результате чего мой индекс в мгновение ока вырастет до нескольких ГБ.
Первые области выборки запросов (это будет соответствовать районам или целым городам, поэтому я использую содержит или внутри):
{
"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]
}
}
]
}
}
}