ElasticSearch之索引模板滾動索引實現(xiàn)詳解
一. 前言
文章合集 : ?? 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 最近有需求涉及到滾動索引方面的概念,但是這一塊一直沒有太系統(tǒng)的了解。這一篇索性把相關的節(jié)點進行深度的學習。
針對版本 :ES 7
吐槽一下 : ES 通病,每次更新后會改來改去。你像MySQL , 更新后 SQL 至少不會有什么減少,ES每次更新,就像重做了一下,API變了不說,各種Maven版本還不能互相適配
二. 索引
在ES中,數(shù)據(jù)存儲在索引中。索引是一種類似于數(shù)據(jù)庫中表的數(shù)據(jù)結構,它包含了一系列的文檔,每個文檔有一個唯一的標識符,稱為文檔ID
通常一個索引包含 :分片 , 映射, 分析器等多個部分組成。我們可以通過 API 創(chuàng)建一個索引 :
PUT /my_index
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"properties": {
"title": {
"type": "text"
}
}
}
}
建立索引的時候可以為其配置很多 Setting 和 properties , 這些配置可以幫助我們更好的使用索引。
但是這衍生一個問題 ,如果索引特別多或者需要滾動索引的時候,每一次都需要配置,這個時候就需要我們使用索引模板了》》》
三. 索引模板
作用
索引模板定義了設置和映射,你可以在創(chuàng)建新索引時自動應用。Elasticsearch根據(jù)與索引名稱相匹配的索引模式,將模板應用于新的索引。
索引模板只在創(chuàng)建索引時應用。對索引模板的改變不影響現(xiàn)有的索引。在創(chuàng)建索引的API請求中指定的設置和映射會覆蓋索引模板中指定的任何設置或映射
3.1 索引模板的創(chuàng)建
PUT _template/test_template
{
"order": 0,
"index_patterns": [
"test_*"
],
"settings": {
"index": {
// 分片數(shù)量
"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_* 是新創(chuàng)建的索引的名稱,number_of_shards 是設置每個新索引的分片數(shù),timestamp 是要插入的時間戳字段。
其他核心的字段 :
template: 匹配模板名稱的模式,可以使用通配符來匹配多個模板。order: 定義模板的匹配順序。較低的數(shù)字優(yōu)先匹配。settings: 指定模板的索引設置,例如副本數(shù)量、分片數(shù)量和分配策略。mappings: 指定模板的索引映射,即文檔類型和字段。aliases: 定義與索引相關聯(lián)的別名。version: 定義模板的版本號,用于在更新模板時進行沖突檢測。index_patterns: 指定要應用模板的索引模式,支持使用通配符指定多個索引。composed_of: 定義其他_templateAPI 模板的組合。priority: 定義模板的優(yōu)先級。較高的數(shù)字優(yōu)先匹配。metadata: 定義模板的任意元數(shù)據(jù)。
Create or update index template API | Elasticsearch Guide [8.6] | Elastic
3.2 索引模板 Setting
setting 用于定義策略,包括分片,刷新等等 ,它擁有如下核心配置 :
- index.number_of_shards:設置每個新創(chuàng)建索引的主分片數(shù)量。默認為 1
- index.number_of_replicas:設置每個新創(chuàng)建索引的副本分片數(shù)量。默認為 1
- index.codec:設置新創(chuàng)建索引所使用的編解碼器
- index.routing.allocation.total_shards_per_node:設置每個節(jié)點最多可以容納的主分片和副本分片總數(shù)
- index.routing.allocation.require:設置新創(chuàng)建索引需要符合的節(jié)點篩選條件
- index.lifecycle.name:設置新創(chuàng)建索引要使用的生命周期策略
- index.refresh_interval:設置新創(chuàng)建索引的刷新間隔時間
- index.max_result_window:設置新創(chuàng)建索引可返回的最大搜索結果數(shù)
- index.mapping.ignore_malformed:設置是否忽略在文檔中出現(xiàn)的字段映射錯誤
- index.analysis.analyzer:設置新創(chuàng)建索引中的分析器
- index.analysis.filter:設置新創(chuàng)建索引中的分析過濾器
3.3 索引映射 :mapping
type:指定字段的數(shù)據(jù)類型index:指定字段是否索引,可以是 analyzed、not_analyzed、no 或 falsestore:指定字段是否存儲,可以是 true 或 falseanalyzer:指定字段分析器的名稱,可以是內(nèi)置分析器或自定義分析器search_analyzer:指定查詢時使用的分析器名稱,可以是內(nèi)置分析器或自定義分析器normalizer:指定字段規(guī)范化器的名稱,用于在查詢和聚合時規(guī)范化字段值copy_to:指定一個或多個字段,將該字段的內(nèi)容復制到指定的字段中,以便在查詢和聚合時使用fields:為字段定義多個屬性,例如不同的分析器、不同的索引設置等format:指定日期類型的格式化方式
注意 :還是由于版本的問題,導致每個版本的寫法不一樣,可能有的還會過時刪除??!
四. 業(yè)務功能
4.1 創(chuàng)建滾動索引
背景 : ES 記錄業(yè)務審計日志,每天生成大量的記錄,導致單個索引過大
前置知識點 :
// 索引別名 : 指向一個或多個索引的可讀寫名稱,它們可以被用來代替實際的索引名稱
- 幫助實現(xiàn)索引的無縫切換,同時也可以減少修改客戶端查詢的需要
- 切換集群,切換測試時都可以快速修改// ES Rollover 特性
- 允許你在索引到達一定大小或者時間上限時自動滾動到一個新的索引中
- 新索引可以是一個完全相同的結構,也可以是不同的
- 可以是在同一個 Elasticsearch 集群中的不同節(jié)點上,也可以是在不同的集群上
創(chuàng)建流程 :
- S1 : 創(chuàng)建一個索引模板 , 為模板定義一個 index_patterns
- S2 : 創(chuàng)建一個索引,并且為索引定義一個別名
- S3 : 觸發(fā)索引的滾動,同時通過別名進行業(yè)務操作
// S1 : 創(chuàng)建模板
- 創(chuàng)建 :此處略,創(chuàng)建方式就是上面的模板創(chuàng)建案例
- 查看創(chuàng)建的模板 : GET _template/test_template
// S2 : 索引創(chuàng)建過程 (這里的實際格式為 <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: 為其觸發(fā)手動滾動規(guī)則 (此處是有3條文檔則滾動一次,此處沒有數(shù)據(jù),所以無法滾動)
POST /test_rollover/_rollover
{
"conditions": {
"max_docs": 3
}
}
// S4 : 插入文檔
POST /test_rollover/_doc
{
"businessInfo":"123"
}
// S5 : 查詢當前文檔數(shù) (這里創(chuàng)建后已經(jīng)有了多條,但是索引只有一個)
GET /test_rollover/_doc/_search
POST /test_rollover/_rollover
{
"conditions": {
"max_docs": 3
}
}
>> 再次觸發(fā)滾動后,發(fā)現(xiàn)已經(jīng)創(chuàng)建了新的
核心重點
- is_write_index 很重要,他將決定翻滾之后的舊索引是否還能被查詢到
- 未配置 :別名會指向新索引,并從舊索引中移除別名 ,通過別名無法查詢到舊的索引
- 配置為 true : 別名會同時指向新舊索引 , 舊索引上的別名is_write_index會被設置為 false,僅可讀
- conditions 有哪些
max_docs: 索引中文檔的最大數(shù)量,超過該數(shù)量將觸發(fā)rollovermax_age: 索引的最大存儲時間,超過該時間將觸發(fā)rollover(30d / 12h 等)max_size: 索引的最大存儲大小,超過該大小將觸發(fā)rollover(5gb / 100mb 等)max_primary_shard_size: 主分片的最大存儲大小,超過該大小將觸發(fā)rollovermax_num_segments: 索引的最大段數(shù),超過該數(shù)量將觸發(fā)rollovermin_index_age: 索引的最小存儲時間,必須等待一段時間后才能rollovermin_doc_count: 索引中文檔的最小數(shù)量,必須達到一定數(shù)量后才能rollover
- 自動化
- 通過 _rollover 手動觸發(fā)
- 通過 Index Lifecycle Management 做生命周期控制
4.2 創(chuàng)建和綁定策略
可以通過控制臺綁定,也可以通過接口

PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_docs": 3
}
}
},
"delete": {
"min_age": "30d",
"actions": {
"delete": {}
}
}
}
}
}
// 創(chuàng)建模板時進行綁定
"settings": {
"lifecycle": {
"name": "my_policy",
"rollover_alias" : "test_rollover"
}
}
總結
ES 這東西真的難受,之前用的好好的版本,換了一個版本啥也用不了,筆記白做,以上記錄不能保證其他版本可用。
ES 索引模板可以幫助我們基于當前ES集群的情況和業(yè)務場景,規(guī)劃出一套性能更優(yōu),場景更符合的配置。
基于滾動索引和策略(不論是腳本調(diào)用或者自動策略),都能實現(xiàn)按計劃滾動索引,避免索引過多。
這東西現(xiàn)在只可意會,不可照抄!!
以上就是ElasticSearch之索引模板滾動索引實現(xiàn)詳解的詳細內(nèi)容,更多關于ElasticSearch索引模板滾動索引的資料請關注腳本之家其它相關文章!
相關文章
SpringBoot 創(chuàng)建容器的實現(xiàn)
這篇文章主要介紹了SpringBoot 創(chuàng)建容器的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-10-10
Java中的DelayQueue實現(xiàn)原理及應用場景詳解
這篇文章主要介紹了Java中的DelayQueue實現(xiàn)原理及應用場景詳解,DelayQueue是一個沒有邊界BlockingQueue實現(xiàn),加入其中的元素必需實現(xiàn)Delayed接口,當生產(chǎn)者線程調(diào)用put之類的方法加入元素時,會觸發(fā)Delayed接口中的compareTo方法進行排序,需要的朋友可以參考下2023-12-12
mybatis?實現(xiàn)多層級collection嵌套
java.lang.NoClassDefFoundError錯誤的原因及解決方法

