博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
elasticsearch更改mapping(不停服务重建索引)
阅读量:5059 次
发布时间:2019-06-12

本文共 1970 字,大约阅读时间需要 6 分钟。

转载地址:http://donlianli.iteye.com/blog/1924721?utm_source=tuicool&utm_medium=referral

 

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

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

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

 

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

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

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

Java代码  
  1. curl -XPOST localhost:9200/_aliases -d '  
  2. {  
  3.     "actions": [  
  4.         { "add": {  
  5.             "alias": "my_index",  
  6.             "index": "my_index_v1"  
  7.         }}  
  8.     ]  
  9. }  
  10. '  

 

 此时,你可以通过同义词my_index访问。包括创建索引,删除索引等。

 

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

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

Java代码  
  1. curl -XPOST localhost:9200/_aliases -d '  
  2. {  
  3.     "actions": [  
  4.         { "remove": {  
  5.             "alias": "my_index",  
  6.             "index": "my_index_v1"  
  7.         }},  
  8.         { "add": {  
  9.             "alias": "my_index",  
  10.             "index": "my_index_v2"  
  11.         }}  
  12.     ]  
  13. }  
  14. '  

 step5,删除老的索引。

Java代码  
  1. curl -XDELETE localhost:9200/my_index_v1  

 

 除此之外,还有几个其他的方法也可以更改mapping。

1、修改程序,添加字段。

就是说,你可以在mapping中增加一个新的字段,然后你对新的字段进行访问统计搜索。这个就要修改两个地方,一个是修改mapping增加字段,还有就是修改你的程序,把字段改成新的字段。

2、更改字段类型为multi_field。

multi_field允许为一个字段设置多个数据类型。应用multi_field的一个最典型的场景是:一个类型定义为analyed,这个字段可以被搜索到,一个类型定义为不分词,这个字段用于排序。

任何字段都可以被更新为multi_field(类型为object和nested的类型除外)。假设现在有一个字段,名字叫created,类型现在为string。

Java代码  
  1. {     "created": { "type": "string"} }  

 我们可以将它增加一种类型,使他既能被当做字符串又能当做日期型。

Java代码  
  1. curl -XPUT localhost:9200/my_index/my_type/_mapping -d '  
  2. {  
  3.     "my_type": {  
  4.         "properties": {  
  5.             "created": {  
  6.                 "type":   "multi_field",  
  7.                 "fields": {  
  8.                     "created": { "type": "string" },  
  9.                     "date":    { "type": "date"   }  
  10.                 }  
  11.             }  
  12.         }  
  13.     }  
  14. }  
  15. '  

 

采用标准的重建索引方式的时候,我们推荐大家为每一个type都建立一个索引同义词,即便在同一个索引库中的多个type,也推荐使用建立一个同义词来访问。即一个index里面包含一个type,因为在elasticsearch中,跨index查询数据是很方便的。这样,我们就可以在reindex一个type后,立即将type生效,而不是将index下面所有的type都重建完后,同义词才能生效。

转载于:https://www.cnblogs.com/bigben0123/p/10059289.html

你可能感兴趣的文章
学习python:day1
查看>>
css3动画属性
查看>>
第九次团队作业-测试报告与用户使用手册
查看>>
Equal Sides Of An Array
查看>>
CentOS笔记-用户和用户组管理
查看>>
Mongodb 基本命令
查看>>
Qt中QTableView中加入Check列实现
查看>>
“富豪相亲大会”究竟迷失了什么?
查看>>
控制文件的备份与恢复
查看>>
返回代码hdu 2054 A==B?
查看>>
Flink独立集群1
查看>>
iOS 8 地图
查看>>
20165235 第八周课下补做
查看>>
[leetcode] 1. Two Sum
查看>>
iOS 日常工作之常用宏定义大全
查看>>
PHP的SQL注入技术实现以及预防措施
查看>>
MVC Razor
查看>>
软件目录结构规范
查看>>
Windbg调试Sql Server 进程
查看>>
linux调度器系列
查看>>