Elasticsearch 索引别名与Template
在使用elasticsearch的时候,经常会遇到需要淘汰掉历史数据的场景。
为了方便数据淘汰,并使得数据管理更加灵活,我们经常会以时间为粒度建立索引,例如:
- 每个月建立一个索引:monthly-201709、monthly-201710、monthly-201711
- 每天建立一个索引:daily-20171015、daily-20171016、daily-20171017、daily-20171018
当不需要再继续使用历史数据的时候,我们就可以将索引删除,释放资源。
为了很好的支撑这个场景,需要使用到Elasticsearch里的两个东西,索引别名和Template。
- 索引别名:建立索引对外的统一视图
例如,如果建立了上述类似的索引时间序列,在查询的时候以wildcards的方式指定索引,例如index=monthly-*,或者index=daily-201710*。当然也可以使用索引别名index=monthly。
- Template:修改建立索引的默认配置
例如,你不想承担定期去维护索引的风险和工作量,可以在插入数据时自动创建索引,Template可以提供自动创建索引时候的默认配置。
下面详细解释一下。
1、索引别名
一个索引别名就好比一个快捷方式(Shortcut)或一个符号链接(Symbolic Link),索引别名可以指向一个或者多个索引,可以在任何需要索引名的API中使用。使用别名可以给我们非常多的灵活性。它能够让我们:
- 在一个运行的集群中透明地从一个索引切换到另一个索引
- 让多个索引形成一个组,比如
last_three_months - 为一个索引中的一部分文档创建一个视图(View)
如何创建索引别名呢?
1)创建索引
我这里创建audit-201710、audit-201711两个索引
curl -XPOST "http://10.93.21.21:8049/kangaroo-201710?pretty"
curl -XPOST "http://10.93.21.21:8049/kangaroo-201711?pretty"
如果安装了head,你可以在可视化页面看到

从索引信息可以看到,我们没有配置mapping和alias,shards和replicas也使用的默认值。
2)建立索引别名
curl -XPOST 'http://10.93.21.21:8049/_aliases' -d '
{
"actions": [
{"add": {"index": "kangaroo-201710", "alias": "kangaroo"}},
{"add": {"index": "kangaroo-201711", "alias": "kangaroo"}}
]
}'
这样就对kangaroo-201710和kangaroo-201711建立了索引别名kangaroo,再看head可视化

可以看到索引别名已经建立。
3)注意
写:不能直接对索引别名进行写入。所以在写数据的时候,要直接使用普通索引。
读:查询,对索引别名进行查询,查询会透明的下发到别名下挂的所有索引执行,设置的路由也会随之下发。
2、带filtered的索引别名
对于同一个索引,例如zoo,我们如何给不同人看到不同的数据,即,所谓的多租户。
假设索引zoo的数据有个字段是group,group字段记录了该数据是那个“租户”的。多租户之间的数据应该是不可见的。
我们模拟一下这个场景
1)创建索引zoo
curl -XPOST "http://10.93.21.21:8049/zoo?pretty"
2)设置mappings
curl -XPOST "http://10.93.21.21:8049/zoo/animal/_mapping?pretty" -d '
{
"animal": {
"properties": {
"name": {"type": "string", index: "not_analyzed"},
"group": {"type": "string", index: "not_analyzed"}
}
}
}'
3)设置带filter的别名
curl -XPOST "http://10.93.21.21:8049/_aliases?pretty" -d '
{
"actions": [
{
"add": {
"index": "zoo",
"alias": "zoo_animal_vegetarian",
"filter":{
"term":{
"group":"vegetarian"
}
}
}
},
{
"add": {
"index": "zoo",
"alias": "zoo_animal_carnivorous",
"filter":{
"term":{
"group":"carnivorous"
}
}
}
}
]
}'
通过head看一下

我们索引两条数据进去
老虎-肉食
curl -XPUT 'http://10.93.21.21:8049/zoo/animal/1' -d '{
"name" : "tiger",
"group" : "carnivorous"
}'
兔子-素食
curl -XPUT 'http://10.93.21.21:8049/zoo/animal/2' -d '{
"name" : "rabbit",
"group" : "vegetarian"
}'
使用带filter的索引查一下
素食的只有兔子
curl -XGET "http://10.93.21.21:8049/zoo_animal_vegetarian/_search?pretty"
{
"took" : ,
"timed_out" : false,
"_shards" : {
"total" : ,
"successful" : ,
"failed" :
},
"hits" : {
"total" : ,
"max_score" : 1.0,
"hits" : [ {
"_index" : "zoo",
"_type" : "animal",
"_id" : "",
"_score" : 1.0,
"_source":{
"name" : "rabbit",
"group" : "vegetarian"
}
} ]
}
}
肉食的只有老虎
curl -XGET "http://10.93.21.21:8049/zoo_animal_carnivorous/_search?pretty"
{
"took" : ,
"timed_out" : false,
"_shards" : {
"total" : ,
"successful" : ,
"failed" :
},
"hits" : {
"total" : ,
"max_score" : 1.0,
"hits" : [ {
"_index" : "zoo",
"_type" : "animal",
"_id" : "",
"_score" : 1.0,
"_source":{
"name" : "tiger",
"group" : "carnivorous"
}
} ]
}
}
当你建立索引时间序列的时候,遇到的问题是,需要不断的建立新索引,例如到了11月份,你可以需要新建kangaroo-201711这个索引。
当然,如果不创建索引,直接写入数据的话,ES会为你分析你写入的document的字段类型,并使用默认配置建立索引。
但是默认配置可能并不是你想要的。例如ES对string类型默认是分析的,即,对string类型会进行分词,但是你的数据中可能有一些string类型的字段不希望被分析。
那么怎么修改默认配置呢?可以创建一个template。
3、Template
template可以修改索引的默认配置。我们以下面这个template为例说明一下。
1)我们建立了一个template名称为kangaroo_template
2)"template": "kangaroo*",表示对于所有以kangaroo*开头的索引,默认配置使用template中的配置。
3)"settings","mappings","aliases",可以修改这些类型的默认配置
4)禁用了_source,对name字段设置string类型且不分析,索引别名设置为kangaroo
curl -XPUT "http://10.93.21.21:8049/_template/kangaroo_template?pretty" -d '{
"template": "kangaroo*",
"settings": {
"number_of_shards":
},
"mappings": {
"data": {
"_source": {
"enabled": false
},
"properties": {
"name": {
"type": "string",
"index": "not_analyzed"
},
"id": {
"type": "long"
}
}
}
},
"aliases": {"kangaroo":{}}
}'
执行生效后,看一下template生效的内容,这里注意有一个"order"字段,该字段跟多template合并有关,后面我们会讲。
curl -XGET "http://10.93.21.21:8049/_template/kangaroo_template?pretty"
{
"kangaroo_template" : {
"order" : ,
"template" : "kangaroo*",
"settings" : {
"index" : {
"number_of_shards" : ""
}
},
"mappings" : {
"data" : {
"_source" : {
"enabled" : false
},
"properties" : {
"name" : {
"index" : "not_analyzed",
"type" : "string"
},
"id" : {
"type" : "long"
}
}
}
},
"aliases" : {
"kangaroo" : { }
}
}
}
我们可以向一个不存在的索引写入数据,这个操作会使用默认配置,如果索引名称命中template中的规则,就会使用template的配置创建索引。
这里我们向kangaroo-201712写入数据,会命中之前创建的kangaroo_template。
curl -XPUT 'http://10.93.21.21:8049/kangaroo-201712/data/1' -d '{
"name" : "yang",
"id" : "",
"weight" : "70 kg"
}'
通过head看一下,可以看到,索引别名已经建立,分片数=10,source禁用生效,name不分析。这就是我们想要的结果。

多个template配置的合并
这个场景是这样的,一个索引命中了多个template配置,例如:有两个template配置分别为:a*, ab*,那么如果有一个索引名字是abc,就会命中了两个template,这时候会怎么样呢?
配置会merge,merge的法则可以参见官方文档,简单来说,就是跟order值有关,较小order值的配置会先生效,较大order值的配置会继而覆盖。
Elasticsearch 索引别名与Template的更多相关文章
- Elasticsearch索引别名、Filtered索引别名、Template
在使用elasticsearch的时候,经常会遇到需要淘汰掉历史数据的场景. 为了方便数据淘汰,并使得数据管理更加灵活,我们经常会以时间为粒度建立索引,例如: 每个月建立一个索引:monthly-20 ...
- Elasticsearch索引别名使用
背景 项目中使用的老的索引,由于数据冗余,会想影响性能.因此需要重新建立索引,但是这样必然需要更新服务中的索引名称,然后重新启动服务,可能会对服务的使用者产生一定的影响.因此,调研了Elasticse ...
- Elasticsearch之索引模板index template与索引别名index alias
为什么需要索引模板? 在实际工作中针对一批大量数据存储的时候需要使用多个索引库,如果手工指定每个索引库的配置信息(settings和mappings)的话就很麻烦了. 所以,这个时候,就存在创建索引模 ...
- ES 10 - Elasticsearch的索引别名和索引模板
目录 1 索引模板概述 1.1 什么是索引模板 1.2 索引模板中的内容 1.3 索引模板的用途 2 创建索引模板 3 查看索引模板 4 删除索引模板 5 模板的使用建议 5.1 一个index中不能 ...
- Elasticsearch 通关教程(三): 索引别名Aliases问题
业务问题 业务需求是不断变化迭代的,也许我们之前写的某个业务逻辑在下个版本就变化了,我们可能需要修改原来的设计,例如数据库可能需要添加一个字段或删减一个字段,而在搜索中也会发生这件事,即使你认为现在的 ...
- Elasticsearch索引模板和别名
创建模板(模板名和索引名一样都不能有大写) PUT http://222.108.x.x:9200/_template/templateds { "template": " ...
- elasticsearch系列二:索引详解(快速入门、索引管理、映射详解、索引别名)
一.快速入门 1. 查看集群的健康状况 http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 ...
- elasticsearch 5.x 系列之七 基于索引别名的零停机升级服务
一,写在前面的话,elasticsearch 建立索引时的Mapping 设置 建议你在设计索引的初期,就把索引的各个字段设计好,因为,elasticsearch 的各个字段,定义好类型后,就无法进行 ...
- elasticsearch最全详细使用教程:入门、索引管理、映射详解、索引别名、分词器、文档管理、路由、搜索详解
一.快速入门1. 查看集群的健康状况http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 状 ...
随机推荐
- Java Sftp上传下载文件
需要使用jar包 jsch-0.1.50.jar sftp上传下载实现类 package com.bstek.transit.sftp; import java.io.File; import ja ...
- 代码的鲁棒性:链表中倒数第k个结点
输入一个链表,输出该链表中倒数第k个结点. 代码思路如下:两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点.然后两个指针同时往后移动,当第一个结点到达 ...
- 使用Gateway-Worker实现多人分组实时聊天 结合第三方tp
一.基础知识1.Workerman是一款纯PHP开发的开源高性能的PHP socket 服务器框架.被广泛的用于手机app.移动通讯等领域的开发. 支持TCP长连接,支持Websocket.HTTP等 ...
- 翻译连载 | 第 9 章:递归(下)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇
原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...
- css之outline实现圆角效果
对,你没有看错,outline也可以实现圆角,不过请先读完自然会知道结果: ============================================================== ...
- 运行Chromium浏览器缺少google api密钥无法登录谷歌账号的解决办法
管理员身份运行CMD,然后依次输入以下三行内容: setx GOOGLE_API_KEY "AIzaSyAUoSnO_8k-3D4-fOp-CFopA_NQAkoVCLw"setx ...
- Django进阶篇【2】
在学习之前,我们补充一个知识点(static用法) 创建APP 配置: setting.py STATICFILES_DIRS = ( os.path.join(BASE_DIR,'static') ...
- 如何在linux下检测内存泄漏
之前的文章应用 Valgrind 发现 Linux 程序的内存问题中介绍了利用Linux系统工具valgrind检测内存泄露的简单用法,本文实现了一个检测内存泄露的工具,包括了原理说明以及实现细节. ...
- 【京东个人中心】——Nodejs/Ajax/HTML5/Mysql爬坑之注册与登录监听
一.引言 在数据库和静态页面都创建好之后,下面就该接着完成后台Node.js监听注册和登录的部分了.这个部分主要使用的技术是:Node.js的Express框架和ajax异步请求.登录和注册的代码实现 ...
- Extjs6随笔(终篇)——内容总结
上个月和Extjs说byebye了,以后大概也没机会用了.之前的博客有点乱,大家看着比较麻烦,所以趁着我还没忘,在这里总结一下♪(^∇^*) 写了个demo,传到git上了,有需要可以自取.Extjs ...