elasticsearch更改mapping(不停服务重建索引)
2016-04-22 11:49
423 查看
转:http://donlianli.iteye.com/blog/1924721?utm_source=tuicool&utm_medium=referral
step1、创建一个索引,这个索引的名称最好带上版本号,比如my_index_v1,my_index_v2等。
step2、创建一个指向本索引的同义词。
此时,你可以通过同义词my_index访问。包括创建索引,删除索引等。
step3,需求来了,需要更改mapping了,此时,你需要创建一个新的索引,比如名称叫my_index_v2(版本升级).,在这个索引里面创建你新的mapping结构。然后,将新的数据刷入新的index里面。在刷数据的过程中,你可能想到直接从老的index中取出数据,然后更改一下格式即可。如何遍历所有的老的index数据
使用java API迁移索引,主要配置参数如下:
step4,修改同义词。将指向v1的同义词,修改为指向v2。http接口如下:
step5,删除老的索引。
除此之外,还有几个其他的方法也可以更改mapping。
1、修改程序,添加字段。
就是说,你可以在mapping中增加一个新的字段,然后你对新的字段进行访问统计搜索。这个就要修改两个地方,一个是修改mapping增加字段,还有就是修改你的程序,把字段改成新的字段。
2、更改字段类型为multi_field。
multi_field允许为一个字段设置多个数据类型。应用multi_field的一个最典型的场景是:一个类型定义为analyed,这个字段可以被搜索到,一个类型定义为不分词,这个字段用于排序。
任何字段都可以被更新为multi_field(类型为object和nested的类型除外)。假设现在有一个字段,名字叫created,类型现在为string。
我们可以将它增加一种类型,使他既能被当做字符串又能当做日期型。
采用标准的重建索引方式的时候,我们推荐大家为每一个type都建立一个索引同义词,即便在同一个索引库中的多个type,也推荐使用建立一个同义词来访问。即一个index里面包含一个type,因为在elasticsearch中,跨index查询数据是很方便的。这样,我们就可以在reindex一个type后,立即将type生效,而不是将index下面所有的type都重建完后,同义词才能生效。
step1、创建一个索引,这个索引的名称最好带上版本号,比如my_index_v1,my_index_v2等。
step2、创建一个指向本索引的同义词。
curl -XPOST localhost:9200/_aliases -d ' { "actions": [ { "add": { "alias": "my_index", "index": "my_index_v1" }} ] } '
此时,你可以通过同义词my_index访问。包括创建索引,删除索引等。
step3,需求来了,需要更改mapping了,此时,你需要创建一个新的索引,比如名称叫my_index_v2(版本升级).,在这个索引里面创建你新的mapping结构。然后,将新的数据刷入新的index里面。在刷数据的过程中,你可能想到直接从老的index中取出数据,然后更改一下格式即可。如何遍历所有的老的index数据
使用java API迁移索引,主要配置参数如下:
String searchHost = "192.168.11.51";// 旧索引地址 int searchPort = 9300;// 旧索引端口 String searchIndexName = "bank";// 旧索引名字 String searchType = "account";// 旧索引类型 String newIndexName = "bak_bank";// 新索引名字 String newType = "account";// 新索引类型 // 过滤器根据实际情况来定义,可以有选择性的导出数据,不定义filter的话,就是导出全部数据 String filter = "{ 'query' : {'query_string' : { 'query' : 'text:blup*'} } }".replaceAll("'", "\""); String basicAuthCredentials = "base64_ifrequried="; boolean withVersion = false; final int hitsPerPage = 2000;//bulk批量操作的内存页大小,一般1000-2500比较合适 float waitInSeconds = 0.0f;//索引线程休眠时间 // increase if you have lots of things to update int keepTimeInMinutes = 90;
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
除此之外,还有几个其他的方法也可以更改mapping。
1、修改程序,添加字段。
就是说,你可以在mapping中增加一个新的字段,然后你对新的字段进行访问统计搜索。这个就要修改两个地方,一个是修改mapping增加字段,还有就是修改你的程序,把字段改成新的字段。
2、更改字段类型为multi_field。
multi_field允许为一个字段设置多个数据类型。应用multi_field的一个最典型的场景是:一个类型定义为analyed,这个字段可以被搜索到,一个类型定义为不分词,这个字段用于排序。
任何字段都可以被更新为multi_field(类型为object和nested的类型除外)。假设现在有一个字段,名字叫created,类型现在为string。
{ "created": { "type": "string"} }
我们可以将它增加一种类型,使他既能被当做字符串又能当做日期型。
curl -XPUT localhost:9200/my_index/my_type/_mapping -d ' { "my_type": { "properties": { "created": { "type": "multi_field", "fields": { "created": { "type": "string" }, "date": { "type": "date" } } } } } } '
采用标准的重建索引方式的时候,我们推荐大家为每一个type都建立一个索引同义词,即便在同一个索引库中的多个type,也推荐使用建立一个同义词来访问。即一个index里面包含一个type,因为在elasticsearch中,跨index查询数据是很方便的。这样,我们就可以在reindex一个type后,立即将type生效,而不是将index下面所有的type都重建完后,同义词才能生效。
相关文章推荐
- #研发解决方案#基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案
- elk在centos7安装
- ELK 索引抽取模板(中文索引配置not_analyzed,才能在kibana中使用terms)
- ELK完整搭建流程(小白入门记)
- CENTOS7安装Elasticsearch
- ELK实战-Logstash multiline:识别错误堆栈
- ELK实战-Logstash:收集rsyslog日志
- ELK实战-Logstash:监控日志文件
- ELKstack 搭建日志管理平台
- ELK中Kibana4中Elasticsearch的UTC时间误差八小时的处理方法
- ELK日志管理之——logstash部署
- ELK日志管理之——elasticsearch部署
- ELK日志管理之——kibana部署
- ELK日志管理之——logstash配置语法
- Elasticsearch - 模式映射之核心类型
- clojure实战——日志处理
- Logstash处理json格式日志文件的三种方法
- 使用elk+redis搭建nginx日志分析平台
- 分布式日志收集之Logstash 笔记(二)
- elk之logstash安装与配置