将数组中的两个重复值转换为字符串

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 查询,或者您可以通过更改查询中的条件来过滤文档。

请记住,运行 用于更新索引中所有文档的脚本可能会在更新过程 运行 时导致一些性能问题。