通过弹性搜索查询从源索引复制时,从目标索引中删除多余的记录

时间:2018-09-19 06:44:09

标签: elasticsearch kibana

我正在使用弹性搜索查询,遇到了类似将记录从一个索引复制到另一个具有相同映射和类型的索引的问题。但是,index1(源)的记录(例如:2)少于index2(目的地:3)。现在,我的要求是将记录从源索引复制到目标索引,并且应该删除目标索引中多余的一条记录(id:3)。我已经在Elasticsearch中使用reindex查询进行了一些跟踪,但是对我来说不起作用。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

应该通过更好的脚本来实现更好/更简便的方法,但是我还没有尝试过。

同样,我假设您的文档不包含任何时间戳字段,该字段可跟踪文档的创建/更新时间,否则,您可以一次使用时间戳执行https://www.npmjs.com/package/webpack-bundle-analyzer重新索引从源到目标。

以下技术利用了Elasticsearch的{​​{3}}和Delete By Query API功能

假设您有

  • 源索引-indexA
  • 目标索引-indexB

创建两个提取管道

PUT _ingest/pipeline/pipeline_one
{
  "description" : "pipeline from indexB to intermediate index",
  "processors" : [
    {
      "set" : {
        "field": "tempField",
        "value": "default"
      }
    }
  ]
}

PUT _ingest/pipeline/pipeline_two
{
  "description" : "pipeline from indexA to intermediate index",
  "processors" : [
    {
      "set" : {
        "field": "tempField",
        "value": "update"
      }
    }
  ]
}

从索引B重新索引到临时索引C。

POST _reindex
{
    "source": {
        "index": "indexB"
    },
    "dest": {
        "index": "indexC",
        "pipeline": "pipeline_one"
    }
}

从索引A重新索引到临时索引C

POST _reindex
{
    "source": {
        "index": "indexA"
    },
    "dest": {
        "index": "indexC",
        "pipeline": "pipeline_two"
    }
}

这样做,现在您知道可以通过按查询删除来删除不需要的文档,并且 tempField 的值仍然是默认

POST indexc/_delete_by_query
{
  "query": {
    "match": {
      "tempField": "default"
    }
  }
}

这时您可以继续删除目标索引。

重新创建目标索引(首先进行备份)并创建下面的管道,以从中间索引到目标使用,同时还删除字段tempField以保留映射。

PUT _ingest/pipeline/pipeline_three
{
  "description" : "pipeline from intermediate to destination index",
  "processors" : [
    {
      "remove" : {
        "field": "tempField"
      }
    }
  ]
}


POST _reindex
{
    "source": {
        "index": "indexC"
    },
    "dest": {
        "index": "indexB",
        "pipeline": "pipeline_three"
    }

}