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
完成 运行 后,您的索引应该正确更新。
我们在 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
完成 运行 后,您的索引应该正确更新。