Elasticsearch 内联字符串替换似乎什么都不做

Elasticsearch inline string replace seems to do nothing

我们在 Elastic search 索引中有一些遗留字段,这给我们带来了一些麻烦,我们想对整个索引执行字符串替换。

例如,一些旧时间戳以 2000-01-01T00:00:00.000+0100 格式存储,但应存储为 2000-01-01T00:00:00.000+01:00.

我尝试 运行 以下查询:

POST /my_index/_update_by_query
{
    "script":
    {
        "lang": "painless",
        "inline": "ctx._source.timestamp = ctx._source.timestamp.replace('+0100', '+01:00')"
    }
}

我 运行 Kibana 中的查询,但我总是遇到查询超时 - 我想这不一定是坏事,因为数据库很大,但我从未看到字段更新。

有没有办法查看此类查询的状态?

我也尝试为更新创建搜索查询,但没有成功:

GET /my_index/_search
{
  "query": {
    "query_string": {
      "query": "*0100",
      "allow_leading_wildcard": true,
      "analyze_wildcard": true,
      "fields": ["timestamp"]
    }
  }
}

不幸的是,它总是 returns 空集 - 不确定可能有什么问题。

实现此类更新的正确方法是什么?

我会使用 ingest pipeline 来解决这个问题,您将使用它来更新整个索引。

首先,像下面这样创建摄取管道。它所做的是检测具有以 +0100 结尾的 timestamp 字段的文档,然后更新时间戳以使用具有正确格式的时区。

PUT _ingest/pipeline/fix-tz
{
  "processors": [
    {
      "dissect": {
        "if": "ctx.timestamp.endsWith('+0100')",
        "field": "timestamp",
        "pattern": "%{timestamp}+%{tz}"
      }
    },
    {
      "set": {
        "if": "ctx.tz != null",
        "field": "timestamp",
        "value": "{{timestamp}}+01:00"
      }
    },
    {
      "remove": {
        "if": "ctx.tz!= null",
        "field": "tz"
      }
    }
  ]
}

然后,创建管道后,您只需使用它更新索引,如下所示:

POST my_index/_update_by_query?pipeline=fix-tz&wait_for_completion=false

完成 运行 后,您的索引应该正确更新。