[译]elasticsearch mapping
- - an74520的专栏es的mapping设置很关键,mapping设置不到位可能导致索引重建. 请看下面各个类型介绍^_^. 每一个JSON字段可以被映射到一个特定的核心类型. JSON本身已经为我们提供了一些输入,支持 string, integer/ long, float/ double, boolean,
and null..
Elasticsearch 的 mapping 在创建
indices
时即已确定,无法更改。那么,当我们需要更新 mapping 时,该如何是好呢?
当我们在创建一条索引时,添加好 mapping 后,可设置一个
alias
指向该索引,然后生产环境采用该alias
来索引数据。当然,如果没有这样做的话,建议趁早备份,修改 API 。
既然已创建的 indices 无法修改,我们可以重新创建一个新的 indices
, 然后将原 indices 上的数据复制到新的 indices 上,再将 alias
指向新 indices
。最后,删除原索引。
test_v1
test
test_v2
将生产索引指向当前索引: test
-> test_v1
Body:
{
"actions":[
{ "add" :{ "index" :"test_v1", "alias" :"test"}}
]}
创建新索引 test_v2
Body:
{
"mappings":{
"content":{
"properties":{
"title":{
"type":"text",
"fields":{
"accurate":{ "type":"keyword"}},
"analyzer":"ik_smart",
"search_analyzer":"ik_smart",
"include_in_all":"true"},
"content":{
"type":"text",
"analyzer":"ik_smart",
"search_analyzer":"ik_smart",
"include_in_all":"true"},
"author":{ "type":"keyword"},
"category":{ "type":"keyword"}}}}}
复制数据: test_v1
-> test_v2
Body:
{
"source":{
"index":"test_v1"},
"dest":{
"index":"test_v2"}}
修改别名: test
-> test_v2
Body:
{
"actions":[
{ "remove" :{ "index" :"test_v1", "alias" :"test"}},
{ "add" :{ "index" :"test_v2", "alias" :"test"}}
]}
test_v1
至此,我们达到了伪更新的效果。不过这里存在一个问题,如果数据量超大的话,复制数据所消费的时间比较多,所以请在构建索引前尽量考虑周全。