Запрос Elasticsearch, если geo_polygon находится внутри многоугольника - PullRequest
2 голосов
/ 18 апреля 2020

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

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

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

2 голосов
/ 18 апреля 2020

@ Нейт прав: мультиполигоны не поддерживаются в запросах 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]
                  ]
                }
              }
            }
          ]
        }
      }
    }
  }
}
0 голосов
/ 01 мая 2020

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

{
  "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 добивается цели. И чтобы не влиять на другие запросы, я заключаю его в отдельный объект bool.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...