我有一些舊檔案,其中一個欄位有兩個重復的陣列,如下所示:
"task" : [
"first_task",
"first_task"
],
我正在嘗試將此陣列轉換為字串,因為它的值相同。我看過以下腳本:將具有 2 個相等值的陣列轉換為單個值,但在我的情況下,這個問題無法通過 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 查詢轉換所有具有此特征的檔案?
謝謝。
uj5u.com熱心網友回復:
_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如果要更新所有檔案,可以洗掉查詢,也可以通過更改查詢中的條件來過濾檔案。
請記住,運行腳本來更新索引中的所有檔案可能會在更新程序運行時導致一些性能問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/473328.html
