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)的了解。這一篇索性把相關(guān)的節(jié)點(diǎn)進(jìn)行深度的學(xué)習(xí)。
針對版本 :ES 7
吐槽一下 : ES 通病,每次更新后會改來改去。你像MySQL , 更新后 SQL 至少不會有什么減少,ES每次更新,就像重做了一下,API變了不說,各種Maven版本還不能互相適配
二. 索引
在ES中,數(shù)據(jù)存儲在索引中。索引是一種類似于數(shù)據(jù)庫中表的數(shù)據(jù)結(jié)構(gòu),它包含了一系列的文檔,每個文檔有一個唯一的標(biāo)識符,稱為文檔ID
通常一個索引包含 :分片 , 映射, 分析器等多個部分組成。我們可以通過 API 創(chuàng)建一個索引 :
PUT /my_index { "settings": { "number_of_shards": 1, "number_of_replicas": 0 }, "mappings": { "properties": { "title": { "type": "text" } } } }
建立索引的時候可以為其配置很多 Setting 和 properties , 這些配置可以幫助我們更好的使用索引。
但是這衍生一個問題 ,如果索引特別多或者需要滾動索引的時候,每一次都需要配置,這個時候就需要我們使用索引模板了》》》
三. 索引模板
作用
索引模板定義了設(shè)置和映射,你可以在創(chuàng)建新索引時自動應(yīng)用。Elasticsearch根據(jù)與索引名稱相匹配的索引模式,將模板應(yīng)用于新的索引。
索引模板只在創(chuàng)建索引時應(yīng)用。對索引模板的改變不影響現(xiàn)有的索引。在創(chuàng)建索引的API請求中指定的設(shè)置和映射會覆蓋索引模板中指定的任何設(shè)置或映射
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è)置每個新索引的分片數(shù),timestamp
是要插入的時間戳字段。
其他核心的字段 :
template
: 匹配模板名稱的模式,可以使用通配符來匹配多個模板。order
: 定義模板的匹配順序。較低的數(shù)字優(yōu)先匹配。settings
: 指定模板的索引設(shè)置,例如副本數(shù)量、分片數(shù)量和分配策略。mappings
: 指定模板的索引映射,即文檔類型和字段。aliases
: 定義與索引相關(guān)聯(lián)的別名。version
: 定義模板的版本號,用于在更新模板時進(jìn)行沖突檢測。index_patterns
: 指定要應(yīng)用模板的索引模式,支持使用通配符指定多個索引。composed_of
: 定義其他_template
API 模板的組合。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:設(shè)置每個新創(chuàng)建索引的主分片數(shù)量。默認(rèn)為 1
- index.number_of_replicas:設(shè)置每個新創(chuàng)建索引的副本分片數(shù)量。默認(rèn)為 1
- index.codec:設(shè)置新創(chuàng)建索引所使用的編解碼器
- index.routing.allocation.total_shards_per_node:設(shè)置每個節(jié)點(diǎn)最多可以容納的主分片和副本分片總數(shù)
- index.routing.allocation.require:設(shè)置新創(chuàng)建索引需要符合的節(jié)點(diǎn)篩選條件
- index.lifecycle.name:設(shè)置新創(chuàng)建索引要使用的生命周期策略
- index.refresh_interval:設(shè)置新創(chuàng)建索引的刷新間隔時間
- index.max_result_window:設(shè)置新創(chuàng)建索引可返回的最大搜索結(jié)果數(shù)
- index.mapping.ignore_malformed:設(shè)置是否忽略在文檔中出現(xiàn)的字段映射錯誤
- index.analysis.analyzer:設(shè)置新創(chuàng)建索引中的分析器
- index.analysis.filter:設(shè)置新創(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)容復(fù)制到指定的字段中,以便在查詢和聚合時使用fields
:為字段定義多個屬性,例如不同的分析器、不同的索引設(shè)置等format
:指定日期類型的格式化方式
注意 :還是由于版本的問題,導(dǎo)致每個版本的寫法不一樣,可能有的還會過時刪除?。?/p>
四. 業(yè)務(wù)功能
4.1 創(chuàng)建滾動索引
背景 : ES 記錄業(yè)務(wù)審計日志,每天生成大量的記錄,導(dǎo)致單個索引過大
前置知識點(diǎn) :
// 索引別名 : 指向一個或多個索引的可讀寫名稱,它們可以被用來代替實際的索引名稱
- 幫助實現(xiàn)索引的無縫切換,同時也可以減少修改客戶端查詢的需要
- 切換集群,切換測試時都可以快速修改// ES Rollover 特性
- 允許你在索引到達(dá)一定大小或者時間上限時自動滾動到一個新的索引中
- 新索引可以是一個完全相同的結(jié)構(gòu),也可以是不同的
- 可以是在同一個 Elasticsearch 集群中的不同節(jié)點(diǎn)上,也可以是在不同的集群上
創(chuàng)建流程 :
- S1 : 創(chuàng)建一個索引模板 , 為模板定義一個 index_patterns
- S2 : 創(chuàng)建一個索引,并且為索引定義一個別名
- S3 : 觸發(fā)索引的滾動,同時通過別名進(jìn)行業(yè)務(wù)操作
// 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 : 查詢當(dāng)前文檔數(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)建了新的
核心重點(diǎn)
- is_write_index 很重要,他將決定翻滾之后的舊索引是否還能被查詢到
- 未配置 :別名會指向新索引,并從舊索引中移除別名 ,通過別名無法查詢到舊的索引
- 配置為 true : 別名會同時指向新舊索引 , 舊索引上的別名is_write_index會被設(shè)置為 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ù)量,必須達(dá)到一定數(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)建模板時進(jìn)行綁定 "settings": { "lifecycle": { "name": "my_policy", "rollover_alias" : "test_rollover" } }
總結(jié)
ES 這東西真的難受,之前用的好好的版本,換了一個版本啥也用不了,筆記白做,以上記錄不能保證其他版本可用。
ES 索引模板可以幫助我們基于當(dāng)前ES集群的情況和業(yè)務(wù)場景,規(guī)劃出一套性能更優(yōu),場景更符合的配置。
基于滾動索引和策略(不論是腳本調(diào)用或者自動策略),都能實現(xiàn)按計劃滾動索引,避免索引過多。
這東西現(xiàn)在只可意會,不可照抄?。?/p>
以上就是ElasticSearch之索引模板滾動索引實現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于ElasticSearch索引模板滾動索引的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot 創(chuàng)建容器的實現(xiàn)
這篇文章主要介紹了SpringBoot 創(chuàng)建容器的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Java中的DelayQueue實現(xiàn)原理及應(yīng)用場景詳解
這篇文章主要介紹了Java中的DelayQueue實現(xiàn)原理及應(yīng)用場景詳解,DelayQueue是一個沒有邊界BlockingQueue實現(xiàn),加入其中的元素必需實現(xiàn)Delayed接口,當(dāng)生產(chǎn)者線程調(diào)用put之類的方法加入元素時,會觸發(fā)Delayed接口中的compareTo方法進(jìn)行排序,需要的朋友可以參考下2023-12-12

mybatis?實現(xiàn)多層級collection嵌套

java.lang.NoClassDefFoundError錯誤的原因及解決方法

Java進(jìn)階教程之運(yùn)行時類型識別RTTI機(jī)制