Elasticsearch 修复日期字段值。 (将字段值从 int 更改为 string)

Elasticsearch fix date field value. (change field value from int to string)

我使用 python 将数据从 mongodb 发送到 elasticsearch。

有一个名为 update_time 的时间戳字段,映射如下:

    "update_time" : {
        "type": "date",
        "format": "yyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
    },

epoch_millis 用于时间戳。

完成所有操作后,我使用 range 查询日期范围内的文档。但是什么都没有return。经过一番研究,我认为问题是: python timestamp int(time.time()) 是 10 位,但在 elasticsearch 中是 13 位,official example :

PUT my_index/my_type/2?timestamp=1420070400000.

所以我尝试将 update_time 字段更新为 1000 倍:

{
  "script": {
    "inline": "ctx._source.update_time=ctx._source.update_time*1000"
  }
}

不幸的是,我发现所有update_time都变成了负号。然后我想出 Java int 类型是 pow(2,32) -1 ,比 1420070400000 低得多。所以我猜时间戳字段不应该是 int ?

然后我想更新字段值从int到string(我不想改变字段映射类型,我知道改变映射类型需要重新索引,但这里只需要改变值)

但是我不知道可以用什么脚本,官方脚本文档没有提到这个

我不知道 groovy 是一种语言,并认为它只用于数学方法,因为 ES 文档只写了关于它的内容。

解决方法很简单,把int转成long就可以了

curl -XPOST http://localhost:9200/my_index/_update_by_query -d '
{
  "script": {
    "inline": "ctx._source.update_time=(long)ctx._source.update_time*1000"
  }
}'