在另一个索引中将多个类型从一个索引重新索引到单个类型

时间:2017-06-28 01:40:15

标签: elasticsearch reindex elasticsearch-mapping

我有两个索引: twitter和reitwitter

twitter有多个不同类型的文档,如:

"hits": [
{
"_index": "twitter",
"_type": "tweet",
"_id": "1",
"_score": 1,
"_source": {
"message": "trying out Elasticsearch"
}
},
{
"_index": "twitter",
"_type": "tweet2",
"_id": "1",
"_score": 1,
"_source": {
"message": "trying out Elasticsearch2"
}
},
{
"_index": "twitter",
"_type": "tweet1",
"_id": "1",
"_score": 1,
"_source": {
"message": "trying out Elasticsearch1"
}
}
]

现在,当我重新索引时,我想摆脱所有不同的类型,只使用一个,因为它们基本上具有相同的字段映射。

我尝试了几种不同的组合,但我总是只得到一份文件而不是那三份: 方法1:

POST _reindex/
{
"source": {
"index": "twitter"
}
,
"dest": {
"index": "reitwitter",
"type": "reitweet"
}
}

响应:

{
"took": 12,
"timed_out": false,
"total": 3,
"updated": 3,
"created": 0,
"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": []
}

注意:它说更新3,因为这是我第二次拨打同一个电话?

第二种方法:

POST _reindex/
{
"source": {
"index": "twitter",
"query": {
"match_all": {
}
}
}
,
"dest": {
"index": "reitwitter",
"type": "reitweet"
}
}

与第一个相同的回应。

在我进行GET调用的两种情况下:

GET reitwitter/_search
{
"query": {
"match_all": {
}
}
}

我只收到一份文件:

{
"_index": "reitwitter",
"_type": "reitweet",
"_id": "1",
"_score": 1,
"_source": {
"message": "trying out Elasticsearch1"
}

这个用例甚至是由reindex支持的吗?如果没有,我是否必须使用扫描和滚动来编写脚本以从源索引获取所有文档并在目标中使用相同的文档类型重新索引它们?

PS:我不想使用" _source":[" tweet1"," tweet"]因为我有大约百万个doc类型我希望每个文档都映射到目标中的相同文档类型。

1 个答案:

答案 0 :(得分:0)

问题是所有文档都有相同的id(1),然后在重新索引过程中它们会覆盖它们。

尝试使用不同的ID索引您的文档,您将看到它有效。