首页 > 解决方案 > 使用弹性搜索查询从源索引复制时从目标索引中删除额外记录

问题描述

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

任何形式的帮助表示赞赏..

标签: elasticsearchkibana

解决方案


通过无痛脚本应该有更好/更简单的方法,但这是我还没有尝试过的东西。

我再次假设,您的文档不包含任何时间戳字段来跟踪文档的创建/更新时间,否则,一旦您从源重新索引到目标您就可以使用时间戳执行按查询 API 删除。

以下技术利用了 Elasticsearch 的Ingest APIReindex功能

假设你有

  • 源索引 - 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"
      }
    }
  ]
}

从 indexB 重新索引到临时 indexC。

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

从 indexA 重新索引到临时 indexC

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

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

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"
    }

}

推荐阅读