在弹性搜索中,我遇到了只对部分索引数据进行重新索引的问题。
使用PHP弹性搜索客户端。
假设我有一个类型为type1
和type2
的索引myindex
。
现在type2
中的一些字段发生了更改,我需要更改映射。
在阅读了他们的文档后,我认为我可以通过创建一个新类型和创建一个别名来逃脱惩罚,但不幸的是,似乎不能为类型提供别名,它只适用于索引。
然后,我想为newtype2
创建一个新的临时映射,将数据从type2
复制到newtype2
并删除type2
。
但现在我找不到任何方法来重命名类型。
不,不能重命名类型。
阅读这篇文章。
我想扩展marcostvz的答案。
如果您真的希望现有索引具有类型名称,即使不能直接执行,也可以在其他索引和重新索引的帮助下执行。
- 创建临时索引
- 将旧类型的原始索引复制到新类型的临时索引
- 重新创建(删除并放置)原始索引
- 将临时索引复制到原始索引
- 删除临时索引
在运行代码时,我遇到了数据在这个过程中丢失的问题。在命令之间添加一点中断(确切地说是sleep 5
)解决了问题
curl -XPUT localhost:9200/index_tmp &&
curl -XPOST localhost:9200/_reindex -H 'Content-Type: application/json' -d '
{
"source": {
"index": "index",
"type": "OldType"
},
"dest": {
"index": "index_tmp",
"type": "NewType"
}
}' &&
curl -XDELETE localhost:9200/index &&
curl -XPUT localhost:9200/index &&
curl -XPOST localhost:9200/_reindex -H 'Content-Type: application/json' -d '
{
"source": {
"index": "index_tmp"
},
"dest": {
"index": "index"
}
}' &&
curl -XDELETE localhost:9200/index_tmp
重命名类型最接近的方法是使用新索引(使用新类型):
- 创建新索引(使用新类型,我使用的是模板)
- 使用新类型重新编制索引
- 删除旧索引
- 创建一个别名(可以用作旧的命名)
将flb_type重命名为_doc:的示例
export INDEX=log-2019.03.12 &&
curl -XPUT localhost:9200/$INDEX-v2 &&
curl -XPOST localhost:9200/_reindex -H 'Content-Type: application/json' -d '
{
"source": {
"index": "'$INDEX'",
"type": "flb_type"
},
"dest": {
"index": "'$INDEX'-v2",
"type": "_doc"
}
}' &&
curl -XDELETE localhost:9200/$INDEX &&
curl -XPOST localhost:9200/_aliases -H 'Content-Type: application/json' -d '
{
"actions": [
{
"add":
{
"alias": "'$INDEX'",
"index": "'$INDEX'-v2"
}
}
]
}'