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

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

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

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

{
   "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 Ответ

0 голосов
/ 14 октября 2018

Мне не удалось решить эту проблему с помощью одного запроса, но я нашел обходной путь.

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

Это дало мне гибкость при написании более сложных запросов, и в качестве бонуса я не дублирую многоугольники, которые в некоторых случаях могут быть очень большими, в результате чего мой индекс в мгновение ока вырастет за несколько ГБ.

Области выборки первого запроса (это будет соответствовать районам или целым городам, поэтому я использую содержимое или внутри):

{
   "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]
               }
            }
         ]
      }
   }
}
...