Я проверяю, находится ли географическая точка в пределах многоугольника с использованием упругости. Я могу заставить его работать просто для «Полигона», однако «Мультиполигон» не работает.

Это работает (полигон):

{
    "query": {
        "bool" : {
            "must" : {
                "match_all" : {}
            },
            "filter" : {
                "geo_polygon" : {
                    "geo" : {
                        "points" : [
                            [-131.602021, 55.117982],
                            [-131.569159, 55.28229],
                            [-131.355558, 55.183705],
                            [-131.38842, 55.01392],
                            [-131.645836, 55.035827],
                            [-131.602021, 55.117982]
                        ]
                    }
                }
            }
        }
    }
}

Это не так (мультиполигон):

{
    "query": {
        "bool" : {
            "must" : {
                "match_all" : {}
            },
            "filter" : {
                "geo_polygon" : {
                    "geo" : {
                        "points" : [
                            [
                                    [-131.602021, 55.117982],
                                    [-131.569159, 55.28229],
                                    [-131.355558, 55.183705],
                                    [-131.38842, 55.01392],
                                    [-131.645836, 55.035827],
                                    [-131.602021, 55.117982]
                            ],
                            [
                                    [-131.832052, 55.42469],
                                    [-131.645836, 55.304197],
                                    [-131.749898, 55.128935],
                                    [-131.832052, 55.189182],
                                    [-131.832052, 55.42469]
                            ]
                         ]
                    }
                }
            }
        }
    }
}

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

2
dylankbuckley 18 Апр 2020 в 02:22

2 ответа

Лучший ответ

@Nate прав - мультиполигоны не поддерживаются в geo_polygon запрашивает, но есть недавно активный PR для включения geo_shape запрашивает типы geo_point - которые идеально подходят для вашего варианта использования.


В то же время вам придется прибегнуть к разделению мультиполигонов и использованию bool-should:

{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "bool": {
          "should": [
            {
              "geo_polygon": {
                "geo": {
                  "points": [
                          [-131.602021, 55.117982],
                          [-131.569159, 55.28229],
                          [-131.355558, 55.183705],
                          [-131.38842, 55.01392],
                          [-131.645836, 55.035827],
                          [-131.602021, 55.117982]
                   ]
                }
              }
            },
            {
              "geo_polygon": {
                "geo": {
                  "points": [
                          [-131.832052, 55.42469],
                          [-131.645836, 55.304197],
                          [-131.749898, 55.128935],
                          [-131.832052, 55.189182],
                          [-131.832052, 55.42469]
                  ]
                }
              }
            }
          ]
        }
      }
    }
  }
}
2
jzzfs 18 Апр 2020 в 10:10

Вышеупомянутый ответ не работал для меня, я попробовал следующее, которое добилось цели:

{
  "query": {
    "bool": {
      "must": [
        {
          "bool": {
            "minimum_should_match": 1,
            "should": [
              {
                "bool": {
                  "must": [
                    {
                      "geo_polygon": {
                        "_name": "location.geo_coordinates",
                        "location.geo_coordinates": {
                          "points": []
                        }
                      }
                    }
                  ]
                }
              },
              {
                "bool": {
                  "must": [
                    {
                      "geo_polygon": {
                        "_name": "location.geo_coordinates",
                        "location.geo_coordinates": {
                          "points": []
                        }
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      ],
    }
  }
}

Minimum_should_match делает свое дело. И чтобы не влиять на другие запросы, я обертываю его в отдельную строку.

0
ARR 1 Май 2020 в 09:54