gpt4 book ai didi

lucene - 如何知道地理坐标是否位于 Elasticsearch 中的地理多边形内?

转载 作者:行者123 更新时间:2023-11-29 02:54:42 25 4
gpt4 key购买 nike

我正在使用 Elasticsearch 1.4.1 - 1.4.4。我正在尝试将地理多边形形状(文档)索引到我的索引中,现在当形状被索引时,我想知道地理坐标是否位于该特定索引地理多边形形状的边界内。

GET /city/_search
{
"query":{
"filtered" : {
"query" : {
"match_all" : {}
},
"filter" : {
"geo_polygon" : {
"location" : {
"points" : [
[72.776491, 19.259634],
[72.955705, 19.268060],
[72.945406, 19.189611],
[72.987291, 19.169507],
[72.963945, 19.069596],
[72.914506, 18.994300],
[72.873994, 19.007933],
[72.817689, 18.896882],
[72.816316, 18.941052],
[72.816316, 19.113720],
[72.816316, 19.113720],
[72.790224, 19.192205],
[72.776491, 19.259634]
]
}
}
}
}
}
}

使用上面的地理多边形过滤器,我能够获得所有索引地理坐标位于描述的多边形内,但我还需要知道非索引地理坐标是否位于该地理多边形中。我怀疑在 Elasticsearch 1.4.1 中是否可行。

最佳答案

是的,Percolator可以用来解决这个问题。

与 Elasticsearch 的正常用例一样,我们将文档索引到 elasticsearch 中,然后对索引数据运行查询以检索匹配/所需的文档。

但渗滤器的工作方式不同。

在渗滤器中,您注册查询,然后通过已注册的查询渗滤文档,并取回与文档匹配的查询。

在浏览了无数的谷歌结果和许多博客之后,我无法找到任何可以解释我如何使用过滤器来解决这个问题的东西。

所以我用一个例子来解释这一点,以便其他面临同样问题的人可以从我的问题和我找到的解决方案中得到提示。我希望有人可以改进我的答案或可以分享更好的方法。

例如:-

首先我们需要创建一个索引。

PUT /city/

然后,我们需要为包含用户的用户文档添加一个映射用于渗透注册查询的经纬度。

PUT /city/user/_mapping
{
"user" : {
"properties" : {
"location" : {
"type" : "geo_point"
}
}
}
}

现在,我们可以将我们的地理多边形查询注册为过滤器,id 为城市名称或您想要的任何其他标识符。

PUT /city/.percolator/mumbai
{
"query":{
"filtered" : {
"query" : {
"match_all" : {}
},
"filter" : {
"geo_polygon" : {
"location" : {
"points" : [
[72.776491, 19.259634],
[72.955705, 19.268060],
[72.945406, 19.189611],
[72.987291, 19.169507],
[72.963945, 19.069596],
[72.914506, 18.994300],
[72.873994, 19.007933],
[72.817689, 18.896882],
[72.816316, 18.941052],
[72.816316, 19.113720],
[72.816316, 19.113720],
[72.790224, 19.192205],
[72.776491, 19.259634]
]
}
}
}
}
}
}

让我们为另一个城市注册另一个地理多边形过滤器

PUT /city/.percolator/delhi
{
"query":{
"filtered" : {
"query" : {
"match_all" : {}
},
"filter" : {
"geo_polygon" : {
"location" : {
"points" : [
[76.846998, 28.865160],
[77.274092, 28.841104],
[77.282331, 28.753252],
[77.482832, 28.596619],
[77.131269, 28.395064],
[76.846998, 28.865160]
]
}
}
}
}
}
}

现在我们已经将 2 个查询注册为过滤器,我们可以通过调用 API 来确定。

GET /city/.percolator/_count

现在要知道任何注册城市是否存在地理点,我们可以使用以下查询渗透用户文档。

GET /city/user/_percolate
{
"doc": {
"location" : {
"lat" : 19.088415,
"lon" : 72.871248
}
}
}

这将返回:_id 作为“孟买”

{
"took": 25,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"total": 1,
"matches": [
{
"_index": "city",
"_id": "mumbai"
}
]
}

用不同的经纬度尝试另一个查询

GET /city/user/_percolate
{
"doc": {
"location" : {
"lat" : 28.539933,
"lon" : 77.331770
}
}
}

这将返回:_id 作为“delhi”

{
"took": 25,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"total": 1,
"matches": [
{
"_index": "city",
"_id": "delhi"
}
]
}

让我们用随机经纬度运行另一个查询

GET /city/user/_percolate
{
"doc": {
"location" : {
"lat" : 18.539933,
"lon" : 45.331770
}
}
}

并且此查询将不会返回任何匹配的结果。

{
"took": 5,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"total": 0,
"matches": []
}

关于lucene - 如何知道地理坐标是否位于 Elasticsearch 中的地理多边形内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29427121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com