Как запросить документы, содержащие массив полигонов с хотя бы одним полигональным фильтром геоформ?

У меня есть документ с областями собственности. Это свойство является массивом полигонов. Скажем, полигоны представляют границы некоторых городов.

Учитывая, что у меня есть ограничивающий прямоугольник, я хочу запросить те документы, у которых есть хотя бы один из полигонов В пределах ограничивающего прямоугольника.

Мой запрос работает, если существует одна область, соответствующая фильтру, или ограничивающий прямоугольник настолько велик, что все полигоны находятся внутри него.

{
   "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]
               }
            }
         ]
      }
   }
}
Другие вопросы по тегам