Elasticsearch修改字段之别名,扩展数据迁移

一、修改已经存在的索引

最观的解决方案是首先备份该索引中已经存在的数据,然后删除它再重建该索引。这种方式比较暴力,当索引中已经存在相当多的数据时,不建议这样做。

另外一种方案是使用_open和_close这一对端点,首先将目标索引关闭,执行需要的更新操作,然后再打开该索引。

POST /symbol/_close

PUT /symbol/_settings
{
  "settings": {
    ....    
  }
}

POST /symbol/_open

这样就避免了需要重建索引的麻烦。有了新添加的filter和analyzer,就可以根据需要再对types中的mappings进行更新了。

二、修改字段可以排序

PUT activity_mini/_mapping/activity_dictionary
{
  "properties": {
    "type_code":{
      "type": "text",
      "fielddata": true
    }
  }
}

修改报错 因为字典名称重复使用所以要使用update_all_types 会更新所有字段名相同的属性
Mapper for [type_code] conflicts with existing mapping in other types:\n[mapper [type_code] is used by multiple types. Set update_all_types to true to update [fielddata] across all types.]

PUT activity_mini_v2_0_1/_mapping/activity_dictionary?update_all_types
{
  "properties": {
    "type_code":{
      "type": "text",
      "fielddata": true
    }
  }
}

三、Elasticsearch的别名,就类似数据库的视图。

创建别名:

我们为索引my_index创建一个别名my_index_alias,这样我们对my_index_alias的操作就像对my_index的操作一样

POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "my_index",
        "alias": "my_index_alias"
      }
    }
  ]
}

Elasticsearch的mapping一旦创建,只能增加字段,而不能修改已经mapping的字段。但现实往往并非如此啊,有时增加一个字段,就好像打了一个补丁,一个可以,但是越补越多,最后自己都觉得惨不忍睹了。怎么办??

这里有一个方法修改mapping,那就是重新建立一个index,然后创建一个新的mapping。你可能会问,这要是在生产环境,可行吗?答案是,如果你一开始就采取了合适的设计,这个完全是可以做到平滑过渡的。

采取什么合理设计呢?就是我们的程序访问索引库时,始终使用同义词来访问,而不要使用真正的indexName。在reindex完数据之后,修改之前的同义词即可。明白了吗?

参考上面的思路,我们来一步一步做。

step1、创建一个索引,这个索引的名称最好带上版本号,比如my_index_v1,my_index_v2等。

step2、创建一个指向本索引的同义词。

POST _aliases
{
 "actions": [
   {
     "add": {
       "index": "activity_mini_v2_0_1", 真是索引
       "alias": "activity_mini" 映射
     }
   }
 ]
}

step3,需求来了,需要更改mapping了,此时,你需要创建一个新的索引,比如名称叫my_index_v2(版本升级).,在这个索引里面创建你新的mapping结构。然后,将新的数据刷入新的index里面。在刷数据的过程中,你可能想到直接从老的index中取出数据,然后更改一下格式即可。如何遍历所有的老的index数据。

将老的索引中的数据复制到新的索引中:

POST _reindex
{
  "source": {
    "index": "metricbeat-*"(老的索引名)
  },
  "dest": {
    "index": "metricbeat"(新的索引名)
  }
}

step4,修改同义词。将指向v1的同义词,修改为指向v2。http接口如下:

curl -XPOST localhost:9200/_aliases -d '
{
"actions": [
{ "remove": {
"alias": "my_index",
"index": "my_index_v1"
}},
{ "add": {
"alias": "my_index",
"index": "my_index_v2"
}}
]
}
'

step5,删除老的索引

curl -XDELETE localhost:9200/my_index_v1

导数据

POST _reindex
{
  "source": {
    "index": "activity_mini2"
  },
  "dest": {
    "index": "activity_mini3"
  }
}
创建映射
POST _aliases
{
  "actions": [
    {
      "remove": {
        "index": "activity_mini2",
        "alias": "activity_mini2_alias"
      }}, 
      {
      "add": {
        "index": "activity_mini3",
        "alias": "activity_mini2_alias"
      }
    }
  ]
}

删除旧索引

DELETE activity_mini2

你可能感兴趣的:(Elasticsearch修改字段之别名,扩展数据迁移)