elasticsearch的索引重建

154 阅读2分钟

尽管可以增加新的类型到索引中,或者增加新的字段到类型中,但是不能添加新的分析器或者对现有的字段做改动。 如果你那么做的话,结果就是那些已经被索引的数据就不正确, 搜索也不能正常工作。

对现有数据的这类改变最简单的办法就是重新索引:用新的设置创建新的索引并把文档从旧的索引复制到新的索引。

字段 _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"  
      }  
    }  
  ]  
}'