说我有
PUT /test/_doc/1
{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch",
"data": {
"modified_date": "2018-11-15T14:12:12",
"password": "abcpassword"
}
}
然后我得到以下映射:
GET /test/_mapping/_doc
{
"test": {
"mappings": {
"_doc": {
"properties": {
"data": {
"properties": {
"modfied_date": {
"type": "date"
},
"password": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
},
"message": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"post_date": {
"type": "date"
},
"user": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
}
如何重新索引映射以使modified_date
与user
处于同一级别并且不会丢失任何数据?
{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch",
"modified_date": "2018-11-15T14:12:12"
"data": {
"password": "abcpassword"
}
}
答案 0 :(得分:2)
我建议使用Ingest Node和Pipelines。您可以在分别添加的链接中了解它们。
基本上,我要做的是构造一个pipeline
并在indexing
或reindexing
过程中提及它,以便您的文档经过文件实际存储在目标索引之前的管道。
我已经为您的用例在管道下面创建了。它的作用是,添加一个具有所需值的新字段modified_date
,并删除字段data.modified_date
。如果其中未提及任何字段,则将不会对其进行修改,并且会将其原样吸收到目标索引中。
PUT _ingest/pipeline/mydatepipeline
{
"description" : "modified date pipeline",
"processors" : [
{
"set" : {
"field": "modified_date",
"value": "{{data.modified_date}}"
}
},
{
"remove": {
"field": "data.modified_date"
}
}
]
}
一旦创建了上述管道,就可以利用它执行重新索引。
POST _reindex
{
"source": {
"index": "test"
},
"dest": {
"index": "test_dest",
"pipeline": "mydatepipeline"
}
}
文档将按照您的期望进行转换,并将在test_dest
索引中进行索引。请注意,您需要根据需要使用映射详细信息来显式创建test_dest
。
您可以在批量操作期间按如下方式使用它:
POST _bulk?pipeline=mydatepipeline
PUT test/_doc/1?pipeline=mydatepipeline
{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch",
"data": {
"modified_date": "2018-11-15T14:12:12",
"password": "abcpassword"
}
}
对于两个Usage 2 and 3
,您需要确保相应地创建了映射。
希望这会有所帮助!