在 elasticsearch 上复制文档

gal*_*007 5 elasticsearch kibana

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

  1. 获取文档
  2. 创建一个新的文档空实例
  3. 通过手动复制 (1) 上结果的属性来更新新文档:
POST /blog/post/VAv2FWoBKgnBpki61WiD/_update {    "doc" : {
  "content" : "..." ...
Run Code Online (Sandbox Code Playgroud)

但问题是该字段包含 veeeery long 属性。有时我会遇到错误,因为当我从 Kibana 界面手动复制字符串时,它们似乎没有被转义。

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

有什么线索吗?

Kam*_*mal 3

利用Reindex API。这是您可以做的。

步骤总结:

  • 创建一个destination_index(虚拟)。确保映射与source_index
  • 使用Reindex API将该特定文档重新索引为source_indexdesitnation_index。在此操作期间,更新 _id (我已经提到过脚本)
  • 将此文档重新索引desitnation_indexsource_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"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

步骤 2:将该文档从目标索引复制到源索引

POST _reindex
{
  "source": {
    "index": "destination_index",
    "query": {
      "match": {
        "_id": "2"
      }
    }
  },
  "dest": {
    "index": "source_index"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助!