Elasticsearch内联字符串替换似乎不起任何作用

Elasticsearch内联字符串替换似乎不起任何作用,
Warning: implode(): Invalid arguments passed in /data/phpspider/zhask/webroot/tpl/detail.html on line 45
,,弹性搜索索引中有一些遗留字段,这给我们带来了一些麻烦,我们希望对整个索引执行字符串替换 例如,一些旧的时间戳以2000-01-01T00:00:00.000+0100的格式存储,但应存储为2000-01-01T00:00:00.000+01:00 我尝试运行以下查询: POST /my_index/_update_by_query { "script": { "lang": "painless",

弹性搜索索引中有一些遗留字段,这给我们带来了一些麻烦,我们希望对整个索引执行字符串替换

例如,一些旧的时间戳以
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"]
    }
  }
}
不幸的是,它总是返回空集-不确定可能出了什么问题


实现这种更新的正确方法是什么?

我将使用一个更新整个索引的方法来解决这个问题

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

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

一旦此操作完全运行,您的索引应该正确更新。

您应该使用
wait\u for\u completion=false
参数在后台运行任务,请参阅!你能检查一下搜索查询吗?为什么它不会返回任何RESSULT?日期字段不像文本字段那样进行分析,所以这就是这种查询(即通配符查询)有效的原因顺便问一下,该字段的映射看起来如何?为什么说“断开”?如果接收到的文档没有错误,则表示该值符合预期的日期格式,即
+0100
+01:00
相同,这两种语法都适用于GMT+1时区。您还可以解释如何对此类字段执行类似
GET/my_index/\u search
的查询吗?这实际上是不可能的。有一个
script
查询,但出于性能原因,它不允许您从
ctx检索原始字符串。\u source