Elasticsearch - 重新索引包含存储/排除字段的文档

Elasticsearch - Reindex documents with stored / excluded fields

我有一个具有以下配置的索引映射:

"mappings" : {
  "_source" : {
    "excludes" : [
      "special_field"
    ]
  },
  "properties" : {
    "special_field" : {
      "type" : "text",
      "store" : true
    },
  }
}

因此,当使用此映射为新文档编制索引时,会得到以下结果:

{
  "_index": "********-2021",
  "_id": "************",
  "_source": {
    ...
  },
  "fields": {
    "special_field": [
      "my special text"
    ]
  }
}

如果执行 _search 查询,special_field 不会在 _source 中返回,因为它被排除在外。

通过以下_search查询,special_field数据完美返回:

GET ********-2021/_search
{
  "stored_fields": [ "special_field" ],
  "_source": true
}

现在我正在尝试重新索引该索引中的所有文档,但我丢失了存储在 special_field 中的信息,只有 _source 字段正在重新索引。

有没有办法把 special_field 放回 _source 字段中?

有没有办法在不丢失 special_field 数据的情况下重新索引该文档?

如何在不丢失 special_field 数据的情况下将这些文档迁移到另一个集群?

谢谢大家

谢谢 Hamid Bayat,我终于用一个小的 logstash 管道得到了它。

我来分享:

input {
  elasticsearch {
    hosts => "my-first-cluster:9200"
    index => "my-index-pattern-*"
    user => "****"
    password => "****"
    query => '{ "stored_fields": [ "special_field" ], "_source": true }'
    size => 500
    scroll => "5m"
    docinfo => true
    docinfo_fields => ["_index", "_type", "_id", "fields"]
  }
}

filter {
  if [@metadata][fields][special_field]{
    mutate {
      add_field => { "special_field" => "%{[@metadata][fields][special_field]}" }
    }
  }
}

output {
  elasticsearch {
    hosts => ["http://my-second-cluster:9200"]
    password => "****"
    user => "****"
    index => "%{[@metadata][_index]}"
    document_id => "%{[@metadata][_id]}"
    template => "/usr/share/logstash/config/index_template.json"
    template_name => "template-name"
    template_overwrite => true 
  }
}

我不得不将 fields 添加到 docinfo_fields => ["_index", "_type", "_id", "fields"] elasticsearch 输入插件中,我所有的 stored_fields 都在 [@metadata][fields] 事件字段上。

由于 @metadata 字段未编入索引,我不得不在根级别添加一个具有 [@metadata][fields][special_field] 值的新字段。

它的工作就像一个魅力。