我的要求是检查特定的geoPoint是否落在圆半径内。
我正在使用geoShape:circle来存储位置。我的文件如下:

PUT location_test/doc/1
    {
        "location" : {
            "type" : "circle",
            "coordinates" : [73.7769,18.5642],
          "radius": "10mi"
        }
    }

和查询如下:
GET location_test/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "geo_shape": {
                "location": {
                  "shape": {
                    "type": "point",
                    "coordinates": [
                      73.877097,
                      18.455303
                    ],
                    "relation": "contains"
                  }
                }
              }
            }
          ]
        }
      }
    }

该查询非常适合单圆几何形状。
但是,现在我要检查特定的geoPoint是否落在多个圆的半径内。
我们可以给我们类似的文件吗?
{
  "location": [
    {
      "type": "circle",
      "coordinates": [
        73.7769,
        18.5642
      ],
      "radius": "10mi"
    },
    {
      "type": "circle",
      "coordinates": [
        -118.240853,
        34.052997
      ],
      "radius": "10mi"
    }
  ]
}

并进行查询以检查geoPoint是否落在哪个圆上。
还是有其他方法可以实现这一目标?

编辑
使用地理位置数组对特定地理位置的文档进行排序是否是一种好习惯?
Mapping :
    {
      "mappings": {
        "doc": {
          "properties": {
            "locationPoint": {
              "type": "geo_point"
            }
          }
        }
      }
    }

PUT location_test2/doc/1
{
  "locationPoint": ["34.075433, -118.307228","36.336356,-119.304597"]
}

PUT location_test2/doc/2
{
  "locationPoint": ["34.075433, -118.307228"]
  }

GET location_test2/_search
{
  "sort": [
      {
      "_geo_distance": {
        "locationPoint": "34.075433, -118.307228",
        "order": "asc"
      }
    }
  ]
}

最佳答案

您当然可以在一个文档中包含多个圆圈,并且如果其中任何一个圆圈包含您的观点,搜索仍将匹配。为简洁起见,请折叠步骤:

PUT location_test
{"mappings":{"properties":{"location":{"type":"geo_shape","strategy":"recursive"}}}}

参加你的圈子:
PUT location_test/_doc/2
{"location":[{"type":"circle","coordinates":[73.7769,18.5642],"radius":"10mi"},{"type":"circle","coordinates":[-118.240853,34.052997],"radius":"10mi"}]}

与单个圈子的查询相同。
GET location_test/_search
{"query":{"bool":{"must":[{"geo_shape":{"location":{"shape":{"type":"point","coordinates":[73.7769,18.5642],"relation":"contains"}}}}]}}}

这产生了我们感兴趣的文档。与直觉相反的是,如果您提供单个对象或对象列表,则无关紧要。 ElasticSearch处理这两种情况都没有映射更改。

请注意,您的circles位于地球的相反两侧:

elasticsearch - Elasticsearch:检查GeoPoint是否存在于多个圆的半径内-LMLPHP

如果您知道这一点,并且查询locations这样有意义,那么一切都很好。

从性能的 Angular 出发,请记住,圆被表示为多边形elasticsearch - Elasticsearch:检查GeoPoint是否存在于多个圆的半径内-LMLPHP

根据您的ES版本,这些表示为一堆triangles

因此,您可能希望索引类似圆形的多边形而不是索引圆形,以加快索引编制的速度,甚至考虑将您的圈子合并到一组多边形(MultiPolygon)中,因为从外观上看,您的圈子列表代表
相关几何。

关于elasticsearch - Elasticsearch:检查GeoPoint是否存在于多个圆的半径内,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60787894/

10-11 11:04