ElasticSearch之索引模板滚动索引实现详解

目录
  • 一. 前言
  • 二. 索引
  • 三. 索引模板
    • 3.1 索引模板的创建
    • 3.2 索引模板 Setting
    • 3.3 索引映射 :mapping
  • 四. 业务功能
    • 4.1 创建滚动索引
    • 4.2 创建和绑定策略
  • 总结

一. 前言

文章合集 : https://zhannei.baidu.com/cse/site?q=ElasticSearch&click=1&cc=jb51.net&s=&nsid=

Github : github.com/black-ant

CASE 备份 : gitee.com/antblack/ca…

ES 最近有需求涉及到滚动索引方面的概念,但是这一块一直没有太系统的了解。这一篇索性把相关的节点进行深度的学习。

针对版本 :ES 7

吐槽一下 : ES 通病,每次更新后会改来改去。你像MySQL , 更新后 SQL 至少不会有什么减少,ES每次更新,就像重做了一下,API变了不说,各种Maven版本还不能互相适配

二. 索引

在ES中,数据存储在索引中。索引是一种类似于数据库中表的数据结构,它包含了一系列的文档,每个文档有一个唯一的标识符,称为文档ID

通常一个索引包含 :分片 , 映射, 分析器等多个部分组成。我们可以通过 API 创建一个索引 :

PUT /my_index
{
    "settings": {
        "number_of_shards": 1,
        "number_of_replicas": 0
    },
    "mappings": {
        "properties": {
            "title": {
                "type": "text"
            }
        }
    }
}

建立索引的时候可以为其配置很多 Setting 和 properties , 这些配置可以帮助我们更好的使用索引。

但是这衍生一个问题 ,如果索引特别多或者需要滚动索引的时候,每一次都需要配置,这个时候就需要我们使用索引模板了》》》

三. 索引模板

作用

索引模板定义了设置和映射,你可以在创建新索引时自动应用。Elasticsearch根据与索引名称相匹配的索引模式,将模板应用于新的索引。

索引模板只在创建索引时应用。对索引模板的改变不影响现有的索引。在创建索引的API请求中指定的设置和映射会覆盖索引模板中指定的任何设置或映射

3.1 索引模板的创建

PUT _template/test_template
{
    "order": 0,
    "index_patterns": [
        "test_*"
    ],
    "settings": {
        "index": {
            // 分片数量
            "number_of_shards": "6",
            // 刷新间隔
            "refresh_interval": "10s"
        }
    },
    "mappings": {
        "properties": {
            "createTime": {
                "type": "date",
                "format": "yyyy-MM-dd HH:mm:ss"
            },
            "requestId": {
                "type": "keyword"
            },
            "title": {
                "type": "text",
                // 分词器
                "analyzer": "standard",
                "fields": {
                    "keyword": {
                        "type": "keyword"
                    }
                }
            }
        }
    },
    "aliases": {}
}

在上面的例子中,my_template 是索引模板的名称,my_index_* 是新创建的索引的名称,number_of_shards 是设置每个新索引的分片数,timestamp 是要插入的时间戳字段。

其他核心的字段 :

  • template: 匹配模板名称的模式,可以使用通配符来匹配多个模板。
  • order: 定义模板的匹配顺序。较低的数字优先匹配。
  • settings: 指定模板的索引设置,例如副本数量、分片数量和分配策略。
  • mappings: 指定模板的索引映射,即文档类型和字段。
  • aliases: 定义与索引相关联的别名。
  • version: 定义模板的版本号,用于在更新模板时进行冲突检测。
  • index_patterns: 指定要应用模板的索引模式,支持使用通配符指定多个索引。
  • composed_of: 定义其他 _template API 模板的组合。
  • priority: 定义模板的优先级。较高的数字优先匹配。
  • metadata: 定义模板的任意元数据。

Create or update index template API | Elasticsearch Guide [8.6] | Elastic

3.2 索引模板 Setting

setting 用于定义策略,包括分片,刷新等等 ,它拥有如下核心配置 :

  • index.number_of_shards:设置每个新创建索引的主分片数量。默认为 1
  • index.number_of_replicas:设置每个新创建索引的副本分片数量。默认为 1
  • index.codec:设置新创建索引所使用的编解码器
  • index.routing.allocation.total_shards_per_node:设置每个节点最多可以容纳的主分片和副本分片总数
  • index.routing.allocation.require:设置新创建索引需要符合的节点筛选条件
  • index.lifecycle.name:设置新创建索引要使用的生命周期策略
  • index.refresh_interval:设置新创建索引的刷新间隔时间
  • index.max_result_window:设置新创建索引可返回的最大搜索结果数
  • index.mapping.ignore_malformed:设置是否忽略在文档中出现的字段映射错误
  • index.analysis.analyzer:设置新创建索引中的分析器
  • index.analysis.filter:设置新创建索引中的分析过滤器

3.3 索引映射 :mapping

  • type:指定字段的数据类型
  • index:指定字段是否索引,可以是 analyzed、not_analyzed、no 或 false
  • store:指定字段是否存储,可以是 true 或 false
  • analyzer:指定字段分析器的名称,可以是内置分析器或自定义分析器
  • search_analyzer:指定查询时使用的分析器名称,可以是内置分析器或自定义分析器
  • normalizer:指定字段规范化器的名称,用于在查询和聚合时规范化字段值
  • copy_to:指定一个或多个字段,将该字段的内容复制到指定的字段中,以便在查询和聚合时使用
  • fields:为字段定义多个属性,例如不同的分析器、不同的索引设置等
  • format:指定日期类型的格式化方式

注意 :还是由于版本的问题,导致每个版本的写法不一样,可能有的还会过时删除!!

四. 业务功能

4.1 创建滚动索引

背景 : ES 记录业务审计日志,每天生成大量的记录,导致单个索引过大

前置知识点 :

// 索引别名 : 指向一个或多个索引的可读写名称,它们可以被用来代替实际的索引名称
- 帮助实现索引的无缝切换,同时也可以减少修改客户端查询的需要
- 切换集群,切换测试时都可以快速修改

// ES Rollover 特性
- 允许你在索引到达一定大小或者时间上限时自动滚动到一个新的索引中
- 新索引可以是一个完全相同的结构,也可以是不同的
- 可以是在同一个 Elasticsearch 集群中的不同节点上,也可以是在不同的集群上

创建流程 :

  • S1 : 创建一个索引模板 , 为模板定义一个 index_patterns
  • S2 : 创建一个索引,并且为索引定义一个别名
  • S3 : 触发索引的滚动,同时通过别名进行业务操作
// S1 : 创建模板
- 创建 :此处略,创建方式就是上面的模板创建案例
- 查看创建的模板 : GET _template/test_template
// S2 : 索引创建过程 (这里的实际格式为 <test-{now/d}-000001>)
PUT %3Ctest_%7Bnow%2Fd%7D-000001%3E
{
  "aliases": {
    "test_rollover": {
      "is_write_index": true
    }
  }
}
GET %3Ctest_%7Bnow%2Fd%7D-000001%3E
// S3: 为其触发手动滚动规则 (此处是有3条文档则滚动一次,此处没有数据,所以无法滚动)
POST /test_rollover/_rollover
{
    "conditions": {
        "max_docs": 3
    }
}
// S4 : 插入文档
POST /test_rollover/_doc
{
  "businessInfo":"123"
}
// S5 : 查询当前文档数 (这里创建后已经有了多条,但是索引只有一个)
GET /test_rollover/_doc/_search
POST /test_rollover/_rollover
{
    "conditions": {
        "max_docs": 3
    }
}
>> 再次触发滚动后,发现已经创建了新的

核心重点

  • is_write_index 很重要,他将决定翻滚之后的旧索引是否还能被查询到

    • 未配置 :别名会指向新索引,并从旧索引中移除别名 ,通过别名无法查询到旧的索引
    • 配置为 true : 别名会同时指向新旧索引 , 旧索引上的别名is_write_index会被设置为 false,仅可读
  • conditions 有哪些
    • max_docs: 索引中文档的最大数量,超过该数量将触发rollover
    • max_age: 索引的最大存储时间,超过该时间将触发rollover(30d / 12h 等)
    • max_size: 索引的最大存储大小,超过该大小将触发rollover(5gb / 100mb 等)
    • max_primary_shard_size: 主分片的最大存储大小,超过该大小将触发rollover
    • max_num_segments: 索引的最大段数,超过该数量将触发rollover
    • min_index_age: 索引的最小存储时间,必须等待一段时间后才能rollover
    • min_doc_count: 索引中文档的最小数量,必须达到一定数量后才能rollover
  • 自动化
    • 通过 _rollover 手动触发
    • 通过 Index Lifecycle Management 做生命周期控制

4.2 创建和绑定策略

可以通过控制台绑定,也可以通过接口

PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
             "max_docs": 3
          }
        }
      },
      "delete": {
        "min_age": "30d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}
// 创建模板时进行绑定
"settings": {
    "lifecycle": {
        "name": "my_policy",
        "rollover_alias" : "test_rollover"
      }
}

总结

ES 这东西真的难受,之前用的好好的版本,换了一个版本啥也用不了,笔记白做,以上记录不能保证其他版本可用。

ES 索引模板可以帮助我们基于当前ES集群的情况和业务场景,规划出一套性能更优,场景更符合的配置。

基于滚动索引和策略(不论是脚本调用或者自动策略),都能实现按计划滚动索引,避免索引过多。

这东西现在只可意会,不可照抄!!

以上就是ElasticSearch之索引模板滚动索引实现详解的详细内容,更多关于ElasticSearch索引模板滚动索引的资料请关注我们其它相关文章!

(0)

相关推荐

  • Elasticsearch查询之Term Query示例解析

    目录 Term Query 基本语法 Java代码写法 Terms-匹配多个值 基本语法 Java写法 Term查询可配置的其他参数 总结 Term Query Term Query是一种最基本的查询方式,它用于在Elasticsearch中查询一个字段中包含指定关键词的文档,与MySQL中的等值查询类似.使用Term Query时,可以对字段进行完全匹配,且区分大小写. 基本语法 GET /{index}/_search { "query": { "term":

  • 详解Elasticsearch如何实现简单的脚本排序

    目录 1.背景 2.分析 3.构建数据 3.1 mapping 3.2 插入数据 4.实现 4.1 根据省升序排序 4.2 湖北省排第一 4.3 湖北省排第一,其余省升序排序,按照年龄倒序 5.完整代码 1.背景 我有一堆学生数据,其中湖北省的学生需要排在所有数据的最前面.其余省正序排序,对于同一个省的数据,按照年龄倒序排序. 2.分析 对于上方的排序需求,湖北省的学生数据需要排在前端,但是湖北省并不是一个字段,那么这个时候改如何实现呢?对于这种场景我们很容易就想到需要脚本script sort

  • Elasticsearch查询 - Match 查询

    目录 Match Query match查询示例 JavaAPI查询示例 match_phrase查询示例 match查询的常用参数 Match查询与Term查询的区别 总结 Match Query Match查询是一种基于全文本的查询方法,可以在一个或多个字段中搜索包含指定文本的文档.它会将查询字符串进行分词处理,然后对每个词进行匹配,从而找到所有匹配的文档. Match查询有两种类型:match_phrase和match.match_phrase用于匹配完整的短语,而match只需匹配单个词

  • Elasticsearch查询Range Query语法示例

    目录 Range Query 查询语法示例 查询数字范围 查询日期范围 查询字符串范围 注意 JavaAPI查询示例 总结 Range Query Range查询可以查询一个范围内的文档.它可以用来查询数值型字段.日期型字段.字符串型字段等等. 我们可以使用range查询来查询符合一定范围内的数据,如查询某个价格区间.某个时间段内的数据等等. 查询语法示例 GET /{index}/_search { "query": { "range": { "{fie

  • 基于php数组中的索引数组和关联数组详解

    php中的索引数组是指以数字为键的数组.并且这个键值 是自增的 关联数组指的是一个键值对应一个值,并且这个键值是不规律的,通常都是我们自己指定的. 他们两还有不同的地方,索引数组转为json后是数组.而关联数组转为json后是对象.通常我们给app端写接口都是用索引数组转成json传过去.客户端那边对数组更为友好一点. 需要注意点: $arr = [0=>1,2=>3a]; 上述数组$arr转为json会是对象形式的. $arr = ['a','b']; 这里的$arr转为json后是数组的形

  • MySQL索引优化之适合构建索引的几种情况详解

    目录 结论 建立索引的场景 小结 结论 在where后面的过滤字段上建立索引(select/update/delete后面的where都是适用的),使用索引加快过滤效率,不用进行全表扫描 在具有唯一要求的字段上添加唯一索引,加快查询效率,查到即可直接返回 group by或者order by后面的字段添加索引,由于索引是排好序的,所以建立索引就等同于在查询之前已经是排好序了(这里需要注意建立的联合索引建立中字段的顺序,可以结合具体案例场景7进行学习) 在DISTINCT(去重字段)后面的字段添加

  • vue.js2.0 实现better-scroll的滚动效果实例详解

    什么是 better-scroll better-scroll 是一个移动端滚动的解决方案,它是基于 iscroll 的重写,它和 iscroll 的主要区别在这里 .better-scroll 也很强大,不仅可以做普通的滚动列表,还可以做轮播图.picker 等等. <template> <div> <div class="goods"> <div class="menu-wrapper" ref="menuWr

  • 微信小程序视图template模板引用的实例详解

    微信小程序视图template模板引用的实例详解 WXML 提供两种文件引用方式import和include. include可以将目标文件除了的整个代码引入,相当于是拷贝到include位置 temlate.wxml <template name="tmp_data" > <view class="content"> <!-- 头像 --> <view class="author-date"> &

  • Android 控制ScrollView滚动的实例详解

    Android 控制ScrollView滚动的实例详解 在开发中,我们经常需要更新列表,并将列表拉倒最底部,比如发表微博,聊天界面等等, 这里有两种办法,第一种,使用scrollTo(): public static void scrollToBottom(final View scroll, final View inner) { Handler mHandler = new Handler(); mHandler.post(new Runnable() { public void run()

  • Android 上下滚动TextSwitcher实例详解

    Android 上下滚动TextSwitcher实例详解 1.在activity中需要代码声明 textSwitcher = (TextSwitcher)findViewById(R.id.text_switcher); textSwitcher.setFactory(new ViewFactory() { @Override public View makeView() { TextView tv = new TextView(MainActivity.this); tv.setTextSiz

  • c++中的单例类模板的实现方法详解

     1.什么是单例模式 在架构设计时,某些类在整个系统生命周期中最多只能有一个对象存在 ( Single Instance ).如超市收银系统,其外观主要由显示器(1个).扫描枪(1个).收款箱(1个)组成,在系统正常运行期间这三部分都是唯一存在的:也就是说,显示器.扫描枪.收款箱这三部分都应该有各自的类,并且每个类只能唯一地实例化一个对象,基于这种模式的程序设计,称为单例模式. !!!单例模式只能创建一个对象,且该对象的生命周期伴随系统的整个运行期间. 2.怎么实现单例模式 思考:如何定义一个类

  • goland 设置注释模板的过程图文详解

    网上找了一些办法 都没有说到关键点: 梳理一下设置步骤如下,以及避免的坑. 新建文件自动加注释: Preferences | Editor | File and Code Templates 打开go File 在右侧输入模板,然后点击Apply: 对已有的方法或者文件添加注释: 1.Preferences | Editor | Live Templates 打开Live Templates,如下图打开go,点击右侧的➕ ,选择live_Template, 2.然后修改Abbreviation,

  • Spring Boot thymeleaf模板引擎的使用详解

    在早期开发的时候,我们完成的都是静态页面也就是html页面,随着时间轴的发展,慢慢的引入了jsp页面,当在后端服务查询到数据之后可以转发到jsp页面,可以轻松的使用jsp页面来实现数据的显示及交互,jsp有非常强大的功能,但是,在使用springboot的时候,整个项目是以jar包的方式运行而不是war包,而且还嵌入了tomcat容器,因此,在默认情况下是不支持jsp页面的.如果直接以纯静态页面的方式会给我们的开发带来很大的麻烦,springboot推荐使用模板引擎. 模板引擎有很多种,jsp,

  • vue3实现数字滚动特效实例详解

    目录 前言 思路 文件目录 使用示例 入口文件index.js main.js使用 requestAnimationFrame.js思路 完整代码: CountTo.vue组件思路 总结 前言 vue3不支持vue-count-to插件,无法使用vue-count-to实现数字动效,数字自动分割,vue-count-to主要针对vue2使用,vue3按照会报错: TypeError: Cannot read properties of undefined (reading '_c') 的错误信息

随机推荐