根本解決ではないかもしれませんが、こうしたらできた、という一例です。
reindexの前に、移行先のmappingを作成しておくことでエラーがでずにreindexができました。
以下、こちらで試した内容です。(Elasticsearch 5.6.0使用)
移行元のindexとテストデータの作成
PUT test-index
{
"mappings": {
"my_child": {
"_parent": {
"type": "my_parent"
},
"_routing": {
"required": true
},
"properties": {
"value": {
"type": "text"
}
}
},
"my_parent": {
"properties": {
"title": {
"type": "text"
}
}
}
}
}
PUT test-index/my_parent/1
{
"title": "this is a parent test."
}
移行先のMappingを事前作成
GET test-index/_mappingの結果から作っただけです。
PUT new-index
{
"mappings": {
"my_child": {
"_parent": {
"type": "my_parent"
},
"_routing": {
"required": true
},
"properties": {
"value": {
"type": "text"
}
}
},
"my_parent": {
"properties": {
"title": {
"type": "text"
}
}
}
}
}
reindexの実行
reindexされたことを確認するために、valueの値を変更するscriptをつけてみました。
POST _reindex
{
"source": {
"index": "test-index"
},
"dest": {
"index": "new-index"
},
"script": {
"inline": """
if (ctx._source.value != null) {
ctx._source.value = ctx._source.value + "_reinded";
}
"""
}
}
これだと正常に終了します。
#! Deprecation: Deprecated field [inline] used, expected [source] instead
{
"took": 45,
"timed_out": false,
"total": 2,
"updated": 0,
"created": 2,
"deleted": 0,
"batches": 1,
"version_conflicts": 0,
"noops": 0,
"retries": {
"bulk": 0,
"search": 0
},
"throttled_millis": 0,
"requests_per_second": -1,
"throttled_until_millis": 0,
"failures": []
}
期待通りにreindexが終ったかを検索する
POST new-index/_search
{
"query": {
"has_child": {
"type": "my_child",
"min_children": 1,
"query": {
"match_all": {}
},
"inner_hits": {}
}
}
}
とやると、こんな感じで、reindexがちゃんと走っていることが確認できました。
(中略)
"hits": [
{
"_type": "my_child",
"_id": "2",
"_score": 1,
"_routing": "1",
"_parent": "1",
"_source": {
"value": "child value_reinded"
}
}
]