【问题标题】:How to swap and migrate index field value in different documents by Elasticsearch query如何通过 Elasticsearch 查询交换和迁移不同文档中的索引字段值
【发布时间】:2021-10-22 00:47:02
【问题描述】:

假设我有一个具有 field emp_id 的 Elasticsearch 索引员工,并且我错误地将文档保存为 emp_id=1 而不是 emp_id=2 并且emp_id=2 而不是 emp_id=1

关于索引员工的示例文档

[
    {
        "emp_id": "1",
        "name": "aaaa"
    },
    {
        "emp_id": "2",
        "name": "bbbb"
    },
    {
        "emp_id": "3",
        "name": "cccc"
    },
    {
        "emp_id": "4",
        "name": "dddd"
    }
]

现在我想将所有文档的 emp_id 值从 emp_id=1 更改/更新为 emp_id=2 并更改 emp_id=2 emp_id=1 使用 Elasticsearch 查询。

所以上述文件应该像这样更改/更新:

[
    {
        "emp_id": "2",
        "name": "aaaa"
    },
    {
        "emp_id": "1",
        "name": "bbbb"
    },
    {
        "emp_id": "3",
        "name": "cccc"
    },
    {
        "emp_id": "4",
        "name": "dddd"
    }
]

注意: emp_id = 1,2,3,4 都存在于同一个索引中。我只想交换和迁移 emp_id 1 和 2 的值,而不影响索引中的其他文档。

如何在 Elasticsearch 中以原子方式执行此操作?

任何帮助将不胜感激。提前致谢!

【问题讨论】:

    标签: elasticsearch elasticsearch-dsl


    【解决方案1】:

    您可以使用摄取管道和_update_by_query endpoint

    首先创建一个带有 script processor 的摄取管道,它将执行原子更改

    PUT _ingest/pipeline/swap_ids
    {
      "processors": [
        {
          "script": {
            "source": """
            ctx.id = (ctx.id == '1') ? '2' : '1';
            """
          }
        }
      ]
    }
    

    然后,选择所有要更新的文档(即带有id = 1 or 2 的文档)并使用您刚刚创建的管道将它们全部更新:

    POST test/_update_by_query?pipeline=swap_ids
    {
      "query": {
        "terms": {
          "id": ["1", "2"]
        }
      }
    }
    

    就是这样!

    【讨论】:

    • 太棒了,很高兴它有帮助!
    • 如果有帮助欢迎采纳,谢谢 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 2019-12-25
    • 2021-07-02
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多