在 elasticsearch 上复制文档

Duplicate a document on elasticsearch

我需要使用 kibana 控制台在我的 elasticsearch 索引(在同一索引中)中克隆文档的内容。我需要文档的 _source 中完全相同的字段(当然,副本将有另一个 id)。我尝试过:

  1. 获取文件
  2. 创建一个新的空文档实例
  3. 更新新文档 手动复制结果的属性 (1):
POST /blog/post/VAv2FWoBKgnBpki61WiD/_update {    "doc" : {
  "content" : "..." ...

但问题是该字段包含非常长的属性。有时我会出错,因为当我从 Kibana 界面手动复制字符串时,它们似乎没有被转义。

我在文档中进行了搜索,但找不到复制文档的查询,我认为这是一个很常见的想法...

有线索吗?

利用Reindex API。这是您可以执行的操作。

步骤总结:

  • 创建一个 destination_index(虚拟)。确保映射 source_index
  • 的映射完全
  • 使用 Reindex API,重新索引 那个 特定文档,从 source_indexdesitnation_index。在此操作期间,更新 _id(我已经提到脚本)
  • 将此文档从 desitnation_index 重新索引到 source_index

重新索引查询

第 1 步:将文档从 source_index 复制到 destination_index。 (附剧本)

POST _reindex
{
  "source": {
    "index": "source_index",
    "query": {
      "match": {
        "_id": "1"
      }
    }
  },
  "dest": {
    "index": "destination_index"
  },
  "script": {
    "inline": "ctx._id=2",
    "lang": "painless"
  }
}

请注意我是如何在上述查询中添加 script 的,这会更改文档的 _id (_id is set as 2)。您的 destination_index 将具有与源完全相同的值的所有字段,但 _id 字段除外。

第 2 步:将该文档从 destination_index 复制到 source_index

POST _reindex
{
  "source": {
    "index": "destination_index",
    "query": {
      "match": {
        "_id": "2"
      }
    }
  },
  "dest": {
    "index": "source_index"
  }
}

现在搜索 source_index,将有两个不同 _ids (_id=1 and _id=2) 的文档具有完全相同的内容。

希望对您有所帮助!