在_reindex API中的字段上使用geo_point数据类型

时间:2019-03-28 13:53:36

标签: elasticsearch kibana

我有包含两个字段的索引:经度和纬度存储为float。我想创建新索引并从第一个索引复制数据,但是使用不同的映射。我将reindex api与弹性处理器一起使用,可以重命名字段并为它们提供不同的数据类型。当我尝试创建类型为“ geo_point”的字段时,它会失败。

"type": "parse_exception",
       "reason": "[type] type [geo_point] not supported, cannot convert field.",

但是当我创建新索引时,我可以创建“ geo_point”类型的字段。 我尝试了不同的解决方法,但是文档说,对于地理查询,您只能使用“ geo_point”类型。 有什么解决办法吗?

{
  "description": "test pipe",
  "processors": [
    {
      "convert": {
        "field": "location", 
        "type": "geo_point"
      }
    }
  ]
}

添加了管道定义。

1 个答案:

答案 0 :(得分:0)

好的,假设您当前的索引映射如下:

PUT oldindex
{
  "mappings": {
    "doc": {
      "properties": {
        "latitude": {
          "type": "float"
        },
        "longitude": {
          "type": "float"
        }
      }
    }
  }
}

您需要使用正确的映射创建一个新索引,如下所示

PUT newindex
{
  "mappings": {
    "doc": {
      "properties": {
        "location": {
          "type": "geo_point"
        }
      }
    }
  }
}

然后,您可以简单地利用reindex API将旧索引复制到新索引中,并使用一些其他脚本来创建位置字段:

POST _reindex
{
  "source": {
    "index": "oldindex",
  },
  "dest": {
    "index": "newindex"
  },
  "script": {
    "source": "ctx._source.location = ['lat': ctx._source.latitude, 'lon': ctx._source.longitude]; ctx._source.remove('latitude'); ctx._source.remove('longitude'); "
  }
}

您最好在新的闪亮索引中使用“位置”字段!