将数组中的两个重复值转换为字符串
Convert two repeated values in array into a string
我有一些旧文档,其中一个字段有一个重复的两个值的数组,像这样:
"task" : [
"first_task",
"first_task"
],
我正在尝试将此数组转换为字符串,因为它具有相同的值。我看过以下脚本:Convert array with 2 equal values to single value 但就我而言,这个问题无法通过 logstash 解决,因为它只发生在存储的旧文档上。
我想做这样的事情:
POST _ingest/pipeline/_simulate
{
"pipeline": {
"processors": [
{
"script": {
"description": "Change task field from array to first element of this one",
"lang": "painless",
"source": """
if (ctx['task'][0] == ctx['task'][1]) {
ctx['task'] = ctx['task'][0];
}
"""
}
}
]
},
"docs": [
{
"_index" : "tasks",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"@timestamp" : "2022-05-03T07:33:44.652Z",
"task" : ["first_task", "first_task"]
}
}
]
}
结果文档如下:
{
"docs" : [
{
"doc" : {
"_index" : "tasks",
"_type" : "_doc",
"_id" : "1",
"_source" : {
"@timestamp" : "2022-05-03T07:33:44.652Z",
"task" : "first_task"
},
"_ingest" : {
"timestamp" : "2022-05-11T09:08:48.150815183Z"
}
}
}
]
}
我们可以看到 task
字段被重新分配,我们将数组的第一个元素作为值。
有没有办法操作 Elasticsearch 的实际数据,并使用 DSL 查询转换所有具有此特征的文档?
谢谢。
您可以使用 _update_by_query
端点实现此目的。这是一个例子:
POST tasks/_update_by_query
{
"script": {
"source": """
if (ctx._source['task'][0] == ctx._source['task'][1]) {
ctx._source['task'] = ctx._source['task'][0];
}
""",
"lang": "painless"
},
"query": {
"match_all": {}
}
}
如果您想更新所有文档,您可以删除 match_all
查询,或者您可以通过更改查询中的条件来过滤文档。
请记住,运行 用于更新索引中所有文档的脚本可能会在更新过程 运行 时导致一些性能问题。
我有一些旧文档,其中一个字段有一个重复的两个值的数组,像这样:
"task" : [
"first_task",
"first_task"
],
我正在尝试将此数组转换为字符串,因为它具有相同的值。我看过以下脚本:Convert array with 2 equal values to single value 但就我而言,这个问题无法通过 logstash 解决,因为它只发生在存储的旧文档上。
我想做这样的事情:
POST _ingest/pipeline/_simulate
{
"pipeline": {
"processors": [
{
"script": {
"description": "Change task field from array to first element of this one",
"lang": "painless",
"source": """
if (ctx['task'][0] == ctx['task'][1]) {
ctx['task'] = ctx['task'][0];
}
"""
}
}
]
},
"docs": [
{
"_index" : "tasks",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"@timestamp" : "2022-05-03T07:33:44.652Z",
"task" : ["first_task", "first_task"]
}
}
]
}
结果文档如下:
{
"docs" : [
{
"doc" : {
"_index" : "tasks",
"_type" : "_doc",
"_id" : "1",
"_source" : {
"@timestamp" : "2022-05-03T07:33:44.652Z",
"task" : "first_task"
},
"_ingest" : {
"timestamp" : "2022-05-11T09:08:48.150815183Z"
}
}
}
]
}
我们可以看到 task
字段被重新分配,我们将数组的第一个元素作为值。
有没有办法操作 Elasticsearch 的实际数据,并使用 DSL 查询转换所有具有此特征的文档?
谢谢。
您可以使用 _update_by_query
端点实现此目的。这是一个例子:
POST tasks/_update_by_query
{
"script": {
"source": """
if (ctx._source['task'][0] == ctx._source['task'][1]) {
ctx._source['task'] = ctx._source['task'][0];
}
""",
"lang": "painless"
},
"query": {
"match_all": {}
}
}
如果您想更新所有文档,您可以删除 match_all
查询,或者您可以通过更改查询中的条件来过滤文档。
请记住,运行 用于更新索引中所有文档的脚本可能会在更新过程 运行 时导致一些性能问题。