【问题标题】:How can I find the location that are within the certain range from my input location?如何从我的输入位置找到特定范围内的位置?
【发布时间】:2018-08-07 15:07:01
【问题描述】:

我有如下映射:

{
"my_locations": {
  "aliases": {

  },
  "mappings": {
    "_doc": {
      "properties": {
          "location": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
        },

我知道如果位置的字段类型是“geo_point”,那么我可以使用以下地理距离查询。

GET /my_locations/_search
{
    "query": {
        "bool" : {
            "must" : {
                "match_all" : {}
            },
            "filter" : {
                "geo_distance" : {
                    "distance" : "200km",
                    "location" : {
                        "lat" : 40,
                        "lon" : -70
                    }
                }
            }
        }
    }
}

我读到我无法将位置的字段类型从文本更改为 geo_point(来自弹性搜索文档和 stackoverflow),并且我已经有很多数据。那么如何找到输入位置在一定范围内的位置呢?

【问题讨论】:

  • 您需要重新索引您的数据才能将您的位置字段的类型更改为geo_point
  • @Val 但重新索引需要删除我的所有数据?
  • 不,您只需创建另一个具有正确数据类型的索引,然后 reindex 会将您当前的索引复制到新索引中。然后,您将能够在新索引上运行查询。 elastic.co/guide/en/elasticsearch/reference/current/…

标签: elasticsearch


【解决方案1】:

首先,您需要创建一个具有正确数据类型的新索引

PUT my_locations_2
{
  "mappings": {
    "_doc": {
      "properties": {
          "location": {
            "type": "geo_point"
          }
      }
   }
}

然后您可以使用reindex API 将数据从旧索引复制到新索引:

POST _reindex
{
  "source": {
    "index": "my_locations"
  },
  "dest": {
    "index": "my_locations_2"
  }
}

【讨论】:

  • 我会尝试很多谢谢。我无法理解文档。所以你的建议帮助我理解了一些基本的
  • 我有一些问题。当我使用文本存储位置时,我有 location": "40.124,-70.254" 像这样但是使用 geo_point 我必须存储 "location" : { "lat" : 40, "lon" : -70 }
  • 您不需要更改数据,也可以将其存储为文本,如下所示:elastic.co/guide/en/elasticsearch/reference/current/…
  • 酷,很高兴它有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-15
相关资源
最近更新 更多