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