Elasticsearch位置数组的非法映射

时间:2020-03-16 14:23:07

标签: elasticsearch geolocation mapping

我想对我的数据集执行Elasticsearch的地理位置查询,如下所示:

{"index": {"_index": "city","_type":"city_info", "_id":0} }
{"fields": { "city" : "AGAWAM", 
             "loc" : [ -72.622739, 42.070206 ], 
             "pop" : 15338, "state" : "MA"},
             "id" : "01001" ,
             "type" : "add"}
...

我能够执行很多查询或聚合,而没有任何问题,但是当涉及到具有地理距离过滤器或在地理坐标上起作用的任何内容的查询时,它将无法工作。这是我的映射测试:

PUT /city/_mappings
{
  "properties": {
    "fields.loc": {
      "type": "geo_point"
    }
  }
}

我收到此错误。

{
  "error" : {
    "root_cause" : [
      {
        "type" : "illegal_argument_exception",
        "reason" : "mapper [fields.loc] of different type, current_type [float], merged_type [geo_point]"
      }
    ],
    "type" : "illegal_argument_exception",
    "reason" : "mapper [fields.loc] of different type, current_type [float], merged_type [geo_point]"
  },
  "status" : 400
}

所以看来我的“ fields.loc”是一个浮点数,而在JSON中它是一个包含浮点值的数组。我试图查看“ loc”的实际类型是什么,并且它的确是一个浮点数,不明白为什么:

GET /city/_mapping
{
  "city" : {
    "mappings" : {
      "properties" : {
        "fields" : {
          "properties" : {
            "city" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "loc" : {
              "type" : "float"
...

所以我不算什么,或者说我不怎么修改从float到geo_point的“ loc”。 因为我是Elasticsearch的初学者,所以我只对eURL使用elasticsearch和kibana。

1 个答案:

答案 0 :(得分:1)

一旦您将数据类型隐式设置为float(通过批量同步,就像您可能做的那样),将float转换为geo_points将会很困难。 我建议删除索引,使用geo_point数据类型设置正确的映射,然后重新同步所有内容。

如果您想更深入一点,请查看_reindex API。这是quick tut。当您的系统在现在可以选择删除的生产环境中运行时,可能会遇到这种情况。

不推荐使用custom _doc类型的FYI。