elasticsearch - Elasticsearch查询如何交换迁移不同文档中的索引字段值

标签 elasticsearch elasticsearch-dsl

假设我有一个带有 字段 emp_id 的 Elasticsearch 索引 Employee,我错误地用 emp_id=1 而不是 emp_id=2 保存了文档,并且emp_id=2 而不是 emp_id=1

索引 Employee 的示例文档

[
    {
        "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 中以原子方式执行此操作?

如有任何帮助,我们将不胜感激。提前致谢!

最佳答案

您可以使用摄取管道和 _update_by_query endpoint 执行此操作:

首先使用 script processor 创建一个摄取管道这将进行原子更改

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

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

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

就是这样!

关于elasticsearch - Elasticsearch查询如何交换迁移不同文档中的索引字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68862591/

相关文章:

security - Kibana服务器认证

python-3.x - Elasticsearch 解析为对象,但发现嵌套值

elasticsearch - 如何在 Elasticsearch 中将 terms query 和 bool query 复合在一起

python - Elasticsearch 查询从 regexp 输入参数中查找列表中值的完全匹配

elasticsearch - 使用python中的 Elasticsearch DSL访问单个字段

java - Elastic search 使用 Java api 查找索引是否存在

elasticsearch - ElasticSearch-FILTER的可选参数?

regex - 在Elasticsearch中提取路径的所有子文件夹

django - 提取数据 “with Elasticsearch dsl”与 “with Django Rest Framework”

python-3.x - 包含 GeoPoint 的位置列表 - (geo_spatial_filter_fields, geo_distance)