在使用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索引别名、Filtered索引别名、Template的更多相关文章

  1. ES 10 - Elasticsearch的索引别名和索引模板

    目录 1 索引模板概述 1.1 什么是索引模板 1.2 索引模板中的内容 1.3 索引模板的用途 2 创建索引模板 3 查看索引模板 4 删除索引模板 5 模板的使用建议 5.1 一个index中不能 ...

  2. elasticsearch系列二:索引详解(快速入门、索引管理、映射详解、索引别名)

    一.快速入门 1. 查看集群的健康状况 http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 ...

  3. 利用别名切换索引流程Elasticsearch 7.7

    背景 公司里面现在有es集群,由于时间过长,es集群中的某个索引过大但是未删除,一直在写入的情况下,昨天写入突然停止了,发现是索引超时的问题,这时想到通过创建一个新的索引来进行索引切换 操作 es 集 ...

  4. ES之四、Elasticsearch集群和索引常用命令

    REST API用途 elasticsearch支持多种通讯,其中包括http请求响应服务,因此通过curl命令,可以发送http请求,并得到json返回内容. ES提供了很多全面的API,常用的RE ...

  5. 〈二〉ElasticSearch的认识:索引、类型、文档

    目录 上节回顾 本节前言 索引index 创建索引 查看索引 查看单个索引 查看所有索引 删除索引 修改索引 修改副本分片数量 关闭索引 索引别名 增加索引别名: 查看索引别名: 删除索引别名: 补充 ...

  6. ElasticSearch生命周期管理-索引策略配置与操作

    概述 本文是在本人学习研究ElasticSearch的生命周期管理策略时,发现官方未提供中文文档,有的也是零零散散,此文主要是翻译官方文档Policy phases and actions模块. 注: ...

  7. Elasticsearch(3):别名

      ES中可以为索引添加别名,一个别名可以指向到多个索引中,同时在添加别名时可以设置筛选条件,指向一个索引的部分数据,实现在关系数据库汇总的视图功能,这就是ES中别名的强大之处.别名是一个非常实用的功 ...

  8. Elasticsearch .Net Client NEST 索引DataSet数据

    NEST 索引DataSet数据,先序列化然后转成dynamic 类型进行索引: /// <summary> /// 索引dataset /// </summary> /// ...

  9. 第三百六十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)基本的索引和文档CRUD操作、增、删、改、查

    第三百六十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)基本的索引和文档CRUD操作.增.删.改.查 elasticsearch(搜索引擎)基本的索引 ...

随机推荐

  1. 066、Weave如何与外网通信?(2019-04-09 周二)

    参考https://www.cnblogs.com/CloudMan6/p/7500550.html   Weave是一个私有的vxlan网络,默认与外部网络隔离.外部网络如何才能访问到weave中的 ...

  2. python模块之hashlib

    摘要算法 1. 摘要算法又称为哈希算法.散列算法,是通过函数将任意长度的数据转化成固定长度的数据串(通常用16进制的字符串表示). 2. 摘要算法将通过摘要函数f()将数据转化成固定长度的摘要(dig ...

  3. tomcat下的Cookie特殊符号问题

    案例:在项目中通过Cookie方式临时存放检索条件,不小心在Cookie值中使用了特殊符号"@",导致在服务器端无法正确解析Cookie值.之所以说"不小心", ...

  4. 安装Blend+SketchFlow Preview for Visual Studio 2012出现错误

    安装Blend+SketchFlow Preview for Visual Studio 2012出现如下错误: 首先是这个网址:http://msdn.microsoft.com/en-us/exp ...

  5. Ajax和Json实现自动补全

    1.index.jsp <%@ page language="java" import="java.util.*" pageEncoding=" ...

  6. luogu 2480 古代猪文 数论合集(CRT+Lucas+qpow+逆元)

    一句话题意:G 的 sigma d|n  C(n d) 次幂  mod 999911659 (我好辣鸡呀还是不会mathjax) 分析: 1.利用欧拉定理简化模运算 ,将上方幂设为x,则x=原式mod ...

  7. 关于jQuery——attr方法和prop方法获取input的checked属性操作

    经常使用jQuery插件的attr方法获取checked属性值,获取的值的大小为未定义,此时可以用prop方法获取其真实值,下面介绍这两种方法的区别: 1.通过prop方法获取checked属性,获取 ...

  8. Java开发环境配置(3)--eclipse汉化插件安装、卸载 中遇到的问题

    eclipse汉化中遇到的问题 网上汉化的帖子很多 如: Eclipse超级完美汉化教程_百度经验http://jingyan.baidu.com/article/e75057f28401a8ebc9 ...

  9. python第四天,list补充

    当我们创建的列表中,元素的排列顺序常常是无法预测的,因为我们并非总能控制用户提供数据的顺序.这虽然在大多数情况下都是不可避免的,但我们经常需要以特定的顺序从呈现信息.有时候,我们希望保留列表元素最初的 ...

  10. golang interface 转 string,int,float64

    func interface2String(inter interface{}) { switch inter.(type) { case string: fmt.Println("stri ...