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 中。
我正在使用弹性检查地理点是否位于多边形内。我可以简单地让它工作 "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 中。