以前不知道es还有别名这个东西,直到碰见了一个问题,请教公司的大神,才发现索引别名这个东西必不可少。
产品有个需求,从我技术的角度描述是这样的:将搜索结果按品牌分组统计数量,取数量最多的前五十个品牌显示在页面上。这个需求不难,用es的聚合很容易就能获得,可是品牌我当时用的是text,这个类型貌似不支持分组聚合,要改为keyword才能够。
我想删掉原来的mapping,再从新构建一个新的。不过当时crontab中运行了一个定时向es导入的脚本,我虽然删掉了mapping,但由于就算没有mapping,es也会本身分析新创建一个mapping,致使我新建的时候,就会提示这个索引已存在。
后来咨询了一下大神,告诉我索引用一个新的名字,新mapping建好以后,建立一个跟以前索引同样的别名,并指向新的索引,就能够实现平滑迁移了。html
假设原来的index命名为product_index
咱们要建立的新的index命名为product_index_1mysql
PUT /product_index_1 { "mappings": { "my_type": { "properties": { "brand": { "type": "keyword", } } } } } POST /_aliases { "actions": [ { "remove": { "index": "*", "alias": "product_index" }}, { "add": { "index": "product_index_1", "alias": "product_index" }} ] }
建立好新的索引,而后删除掉全部以product_index为别名的索引,而后将别名product_index指向product_index_1索引。sql
新创建的索引里面确定是没有数据的,要保证不影响搜索结果,先把数据补充上,而后再改别名,我不建议直接用es当数据库,怕误删,数据都是从mysql里面导入的,目的只是为加快全文检索。数据库
参考:
官方文档:https://www.elastic.co/guide/...
还有一篇文章介绍了其余的别名应用场景:
https://www.cnblogs.com/rainw...app