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]
值的新字段。
它的工作就像一个魅力。
我有一个具有以下配置的索引映射:
"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]
值的新字段。
它的工作就像一个魅力。