ElasticSearch:如何使用现有数据将字段移到另一个级别?

时间:2018-11-08 20:32:18

标签: elasticsearch elasticsearch-6

说我有

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_dateuser处于同一级别并且不会丢失任何数据?

{
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elasticsearch",
    "modified_date": "2018-11-15T14:12:12"
    "data": {
        "password": "abcpassword"
    }
}

1 个答案:

答案 0 :(得分:2)

我建议使用Ingest NodePipelines。您可以在分别添加的链接中了解它们。

基本上,我要做的是构造一个pipeline并在indexingreindexing过程中提及它,以便您的文档经过文件实际存储在目标索引之前的管道

我已经为您的用例在管道下面创建了。它的作用是,添加一个具有所需值的新字段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"
      }
    }
  ]
}

一旦创建了上述管道,就可以利用它执行重新索引。

用法1:在重新索引到新索引期间

POST _reindex
{
  "source": {
    "index": "test"
  },
  "dest": {
    "index": "test_dest",
    "pipeline": "mydatepipeline"
  }
}

文档将按照您的期望进行转换,并将在test_dest索引中进行索引。请注意,您需要根据需要使用映射详细信息来显式创建test_dest

用法2:在索引编制之前的批量操作期间使用管道

您可以在批量操作期间按如下方式使用它:

POST _bulk?pipeline=mydatepipeline

用法3:在索引编制过程中在单个文档上使用管道

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,您需要确保相应地创建了映射。

希望这会有所帮助!