尽管可以增加新的类型到索引中,或者增加新的字段到类型中,但是不能添加新的分析器或者对现有的字段做改动。 如果你那么做的话,结果就是那些已经被索引的数据就不正确, 搜索也不能正常工作。
对现有数据的这类改变最简单的办法就是重新索引:用新的设置创建新的索引并把文档从旧的索引复制到新的索引。
字段 _source 的一个优点是在Elasticsearch中已经有整个文档。你不必从源数据中重建索引,而且那样通常比较慢。
为了有效的重新索引所有在旧的索引中的文档,用 scroll 从旧的索引检索批量文档 , 然后用 bulk API 把文档推送到新的索引中。
从Elasticsearch v2.3.0开始, Reindex API 被引入。它能够对文档重建索引而不需要任何插件或外部工具。
1、创建trade
curl -XPUT -H "Content-Type: application/json;charset=UTF-8" "http://192.168.1.2:9200/trade" -d '
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"properties": {
"name": { "type": "text" },
"email": { "type": "text" }
}
}
}
2、给索引创建别名
curl -XPUT -H "Content-Type: application/json;charset=UTF-8" "http://192.168.1.2:9200/trade/_alias/alias_trade"
3、向trade中插入几条数据
curl -XPOST "http://192.168.1.2:9200/alias_trade/product/_bulk" -d '
{"create":{"_id":1}}
{"name":"name 01","price":1}
{"create":{"_id":2}}
{"name":"name 02","price":2}
{"create":{"_id":3}}
{"name":"name 03","price":3}
{"create":{"_id":4}}
{"name":"name 04","price":4}
{"create":{"_id":5}}
{"name":"name 05","price":5}
{"create":{"_id":6}}
{"name":"name 06","price":6}
{"create":{"_id":7}}
{"name":"name 07","price":7}
{"create":{"_id":8}}
{"name":"name 08","price":8}
{"create":{"_id":9}}
{"name":"name 09","price":9}
'
4、创建新的索引trade2
curl -XPUT -H "Content-Type: application/json;charset=UTF-8" "http://192.168.1.2:9200/trade2" -d'
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"product" : {
"properties": {
"name" : {
"type": "string"
},
"price" : {
"type": "integer"
}
}
}
}
}'
5、重建索引
POST _reindex
{
"source": {
"index": "trade"
},
"dest": {
"index": "trade2"
}
}
6、实现不重启服务索引的切换
curl -XPOST -H "Content-Type: application/json;charset=UTF-8" "http://192.168.1.2:9200/_aliases" -d'
{
"actions": [
{
"remove": {
"index": "trade",
"alias": "alias_trade"
}
},
{
"add": {
"index": "trade2",
"alias": "alias_trade"
}
}
]
}'