Elasticsearch 查询 geo_polygon 是否在多边形内

Elasticsearch query if geo_polygon is inside a multi-polygon

我正在使用弹性检查地理点是否位于多边形内。我可以简单地让它工作 "Polygon",但是 "MultiPolygon" 不起作用。

这个有效(多边形):

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

我的理解是,我可能需要对每个单独的多边形进行某种布尔查询 - 但是,任何指导都很好。

@Nate 是对的——geo_polygon queries but there's a recently-active PR to enable 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]
                  ]
                }
              }
            }
          ]
        }
      }
    }
  }
}

以上答案对我不起作用我尝试了以下方法:

{
  "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 中。