ElasticSearch深入解析(八):索引設置、索引別名、索引模板

一、索引的動態設置、靜態設置

  • 索引設置包含兩部分核心內容:
    • 靜態設置(static index settings),只允許在創建索引時或者針對已關閉的索引進行設置。
    • 指動態設置(dynamic index settings),可以借助更新設置(update settings)的方式進行動態更新,更新后立即生效。

1. 靜態設置

靜態設置實戰場景舉例如下:
設置主分片大小的參數是index.number_of_shards,只在創建索引時生效,不支持動態修改。

默認主分片大小為1,且每個索引的分片數量上限默認為1024。此限制是一個安全限制,可防止索引分片數過多導致集群不穩定。

如果在業務層面擴充節點后確實需要擴展主分片數,該怎么辦?
答案:在非業務核心時間通過reindex操作遷移實現。?

2. 動態設置

動態設置的實戰場景舉例如下:

  • 設置副本數參數為index.number_of_replicas,可以動態修改:
PUT news_index/_settings
{"number_of_replicas":3
}
  • 設置刷新頻率參數為index.refresh_interval,可以動態修改:
PUT news_index/_settings
{"refresh_interval":"1s"
}

默認刷新頻率參數值為1s,即每秒刷新一次。這1s決定了Elasticsearch是近實時的搜索引擎,而非準實時搜索引擎。如果業務層面對實時性的要求不高,可以考慮將該值調大。因為如果采用1s,則每秒都會生成一個新的分段(關于分段的概念可以參考最后一章),會影響寫入性能。

  • max_result_window是Elasticsearch中的一個設置參數,用于控制搜索結果的最大窗口的大小:

默認情況下,max_result_window的值為10000,這意味著在分頁搜索時最多可以返回10000條數據。如果每頁可顯示10條數據,那么最多可以翻到1000頁。在某些情況下,可能需要處理比默認值更大的數據集。

在這種情況下,可以通過更新索引設置來動態修改max_result_window的值:

PUT news_index/_settings
{"max_result_window":50000
}

上述命令將max_result_window的值設置為50000。此時如果每頁顯示10條數據,則可以最多翻到5000頁。

增大max_result_window的值可能會對Elasticsearch集群的性能產生影響,尤其是在處理大量數據時。因此,在根據實際需求調整此參數時,要權衡性能和查詢范圍之間的關系。如果需要遍歷大量數據,則建議使用scroll API或search_after參數,以更高效地進行處理。

在 Elasticsearch 中,max_result_window參數(默認值為 10000)主要限制的是基于from + size的深度分頁查詢(即通過from指定偏移量,size指定每頁大小)。這種查詢方式在偏移量(from)較大時,會導致 Elasticsearch 在每個分片上生成大量中間結果并合并,消耗大量內存和 CPU,甚至引發 OOM(內存溢出)。
而 scroll API 和 search_after 這兩種分頁方式,設計上避免了max_result_window的直接限制。

二、索引別名

  • 索引別名常見的使用場景:
    • 當需要定期創建新索引(如日志按天 / 月分割),同時保持應用端無需感知索引名稱變化時,通過別名指向 “當前有效索引”,實現無縫切換。
    • 索引重建或結構升級:舊索引 users_v1 需升級到 users_v2(如新增字段、調整映射),先通過別名 users 指向 users_v1,應用正常訪問,重建完成后,通過原子操作切換別名指向 users_v2,實現無感知遷移。

索引別名只是物理索引的軟鏈接的名稱而已,一個索引可以創建多個別名,一個別名也可以指向多個索引。

實戰中,很多工程師在開發中后期才發現索引別名的妙處。正如前文所說,別名能進行高效的索引管理,能進行索引數據修改或更新操作并確保用戶無感知。

  • 示例場景
    線上索引 users_v1 需要新增一個分詞器為 ik_max_word 的字段 address,但直接修改映射會導致集群分片重建,且舊數據無法應用新分詞器(需重建索引)。

  • 傳統方案(無別名)的痛點

  1. 重建新索引 users_v2 并遷移數據,需修改所有客戶端代碼/配置中的索引名,易遺漏導致線上故障;
  2. 切換期間需停機或雙寫,用戶體驗差。
  • 別名實現無感知升級(步驟)
  1. 創建新索引并綁定臨時別名

    PUT /users_v2
    {"mappings": {"properties": {"address": { "type": "text", "analyzer": "ik_max_word" }}}
    }
    POST /_aliases
    {"actions": [{ "add": { "index": "users_v2", "alias": "users_tmp" } }]
    }
    
    • 開發/測試環境通過 users_tmp 驗證新索引邏輯,不影響線上 users_v1
  2. 生產環境雙寫驗證

    • 應用端同時寫入 users_v1users_v2(通過別名解耦,代碼無需硬編碼索引名),
    • 讀取時通過別名 users 暫指向 users_v1,確保線上流量無影響。
  3. 原子切換別名指向

    POST /_aliases
    {"actions": [{ "remove": { "index": "users_v1", "alias": "users" } },{ "add": { "index": "users_v2", "alias": "users" } }// 可同時刪除舊索引(需確保數據遷移完成)]
    }
    
    • 切換瞬間完成,客戶端無感知,無需重啟服務或修改配置。
  • 核心價值
  • 風險隔離:通過臨時別名 users_tmp 驗證新索引,避免直接操作線上索引;
  • 零停機遷移:利用別名的原子操作,實現“熱切換”,用戶請求始終路由到有效索引。
  1. 從別名檢索:

在 Elasticsearch 中,檢索時使用索引別名與使用真實索引名的操作完全一致,別名會被透明解析為實際指向的索引(單個或多個)。

# 簡單查詢
GET /my_alias/_search
{"query": { "match_all": {} }
}# 帶過濾的查詢
GET /my_alias/_search
{"query": { "term": { "status": "active" } }
}

若別名指向多個索引(如 logs_2025_q1 指向 logs-2025-01、logs-2025-02、logs-2025-03),檢索時會同時查詢所有關聯索引:

GET /logs_2025_q1/_search
{"query": { "range": { "timestamp": { "gte": "2025-01-01" } } }
}

等價于 GET /logs-2025-01,logs-2025-02,logs-2025-03/_search,但別名簡化了索引列表的維護。

別名支持通配符模式(如 logs-*),檢索時自動匹配所有符合模式的索引:

# 創建別名匹配2025年4月的所有日志索引
POST /_aliases
{"actions": [{ "add": { "index": "logs-2025-04*", "alias": "april_logs" } }]
}
# 檢索時使用別名
GET /april_logs/_search
{ "query": { "term": { "service": "user-center" } } }

避免在 DSL 中硬編碼索引模式(如 logs-2025-04*),通過別名統一管理匹配規則。

三、索引模板

  • 兩個常見的業務場景問題:
    • 問題1:數據量非常大,需要進行索引生命周期管理,具體要按日期劃分索引,且要求多個索引的Mapping一致,而每次手動創建或者腳本創建都很麻煩,怎么辦?
    • 問題2:實際業務中應用了多個索引,想讓這些索引中相同名字的字段類型完全一致,以便實現跨索引檢索,怎么辦?

我們會發現傳統方式不能解決多索引的快速定義和高效管理等問題。因此,索引模板應運而生。

1. 索引模板的定義

Elasticsearch 7.8及之后版本支持兩種定義模板的方式,可簡記為普通模板定義方式組件模板新增/創建方式

  • 普通模板定義方式如下所示:
PUT _index_template/<template_name>  # 模板名稱(唯一)
{"index_patterns": ["logs-*", "metrics-*"],  # 匹配的索引名模式(支持通配符)"priority": 100,                            # 模板優先級(高優先級覆蓋低優先級)"template": {                               # 新索引的配置內容"settings": {                             # 索引設置(分片、副本、刷新間隔等)"number_of_shards": 3,"number_of_replicas": 1,"refresh_interval": "30s"},"mappings": {                             # 字段映射(類型、分詞器、動態模板等)"dynamic": "strict",                     # 嚴格模式(禁止自動添加未定義字段)"properties": {"@timestamp": { "type": "date" },      # 時間字段(必選,用于時序數據)"message": { "type": "text", "analyzer": "ik_max_word",            # 中文分詞器(需提前安裝)"fields": { "keyword": { "type": "keyword" } }  # 同時存儲keyword子字段}}},"aliases": {                              # 為新索引自動綁定別名"current_logs": {}                       # 別名指向新索引(無額外配置)}},"composed_of": ["ilm_policy_template"]      # 組合其他組件模板(可選,8.x+ 支持)
}

而組件模板的核心在于將原有普通模板定義的mappings、settings等以組件的方式分隔,以便最小化更新模板。

  • 組件模板定義方式如下所示:

在這里插入圖片描述
在這里插入圖片描述

由上可知,模板名稱為mydata_template,包含兩個核心組件——component_mapping_template、component_settings_template。component_mapping_template組件模板實現了映射的定義,component_settings_template實現了設置和別名的定義。

當業務層面需要更新映射時,只需要更新component_mapping_template組件模板即可,改動范圍更小、操作更精細化。

2. 索引模板應用的常見問題

模板和索引在應用上的區別是什么?

索引針對的是單一索引,類似MySQL中的一個表。而模板針對一個或多個索引,或者說是針對具有相同表結構的一類索引。

如果想更新映射,那么可以通過更新模板來實現嗎?

首先需要建立這樣一個認知前提:一旦創建了映射,除幾個特定的類型以外,其他類型都不支持更新,除非進行reindex操作。

所以,一旦創建了索引,對索引模板的更新將不會影響該索引。

更新模板僅適用于新創建的索引。更新為動態模板僅會影響索引中的新字段。

分段

在Elasticsearch(基于Lucene實現)中,“分段”(Segment)是底層存儲和處理數據的基本單元,本質上是一個不可變的倒排索引文件。以下是具體解釋:

分段的本質與作用

  • 倒排索引載體:每個分段存儲一組文檔的倒排索引(關鍵詞到文檔的映射),是Lucene實現快速搜索的核心數據結構。
  • 獨立搜索單元:分段一旦生成就不可修改,可獨立被搜索,多個分段的搜索結果會在查詢時合并。
  • 寫入過程的中間產物:文檔寫入時不會直接寫入磁盤上的主索引,而是先存入內存緩沖區,通過定期刷新(refresh)生成新分段。

分段與“近實時”機制的關系

  • 默認1秒刷新(refresh_interval
    Elasticsearch默認每1秒將內存緩沖區中的文檔寫入一個新分段(并開放搜索),這使得數據在寫入后1秒內可見,實現“近實時”(Near Real-Time)。

    • 若調大該值(如30s),則每30秒生成一個分段,數據可見延遲增加,但減少分段生成頻率。
  • “準實時”與“近實時”的區別

    • 準實時:數據可見延遲較長(如分鐘級),分段生成頻率低。
    • 近實時:通過高頻刷新(1秒)縮短延遲,但代價是分段數量增加。

分段對寫入性能的影響

  • 頻繁生成分段的代價
    每次refresh會:

    1. 將內存數據寫入分段文件(磁盤I/O);
    2. 生成新的分段元數據(如文件句柄、索引結構);
    3. 可能觸發后續的分段合并(merge)操作(長期分段過多時,Elasticsearch會自動合并小分段為大分段,減少搜索時的開銷)。
      這些操作在高寫入負載下會消耗CPU、磁盤I/O和內存資源,降低寫入吞吐量。
  • 調大刷新間隔的優勢
    減少分段生成頻率,降低I/O和元數據管理開銷,提升寫入性能,適合對實時性要求不高的場景(如日志分析、離線報表)。

分段的生命周期

  • 生成:通過refresh操作將內存數據寫入新分段(默認1秒一次)。
  • 存在:分段不可變,可被搜索,直到被合并或刪除。
  • 合并:Elasticsearch后臺定期合并小分段為大分段,減少分段數量,提升搜索效率(合并過程會釋放舊分段資源)。
  • 刪除:當文檔被刪除時,分段不會立即修改,而是記錄“刪除標記”,合并時才真正移除被刪除的文檔。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/79866.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/79866.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/79866.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Prometheus實戰教程:k8s平臺手動部署Grafana

以下是一個可用于生產環境的 Kubernetes 部署 Grafana 的 YAML 文件。該配置包括 Deployment、Service、ConfigMap 和 PersistentVolumeClaim&#xff0c;確保 Grafana 的高可用性和數據持久化。 Grafana 生產部署 YAML 文件 ☆實操示例 cat grafana-deployment.yaml 登錄后復制…

VSTO外接程序與VBA的聯動嘗試

文章目錄 前言一、第一坑&#xff1a;安裝offic2007后excel加載項找不到了二、示例1 通過Ribbon XML自定義Excel主菜單并添加新項二、示例1 總結三、示例2 創建VSTO外接程序三、示例2 總結四、示例 3 C# VSTO外接程序示例四、示例 3 總結五、實現C# 的VSTO調用VBA函數(xlam)六、…

DeepSeek驅動的金市情緒量化:NLP解析貿易政策文本的情緒傳導路徑

【AI觀察】政策信號與市場情緒的量化關聯 基于自然語言處理技術對全球財經文本的情緒分析顯示&#xff0c;4月30日亞盤時段現貨黃金價格波動率較前日下降12.3%&#xff0c;與技術面修正指標呈現強相關性。特政府最新關稅政策調整引發市場風險偏好指數&#xff08;RPI&#xff…

期末代碼Python

以下是 學生信息管理系統 的簡化版代碼示例&#xff08;控制臺版本&#xff0c;使用文件存儲數據&#xff09;&#xff0c;包含核心功能&#xff1a; 1. 定義學生類 class Student: def __init__(self, sid, name, score): self.sid sid # 學號 self.name name # 姓名 self.s…

zotero pdf中英翻譯插件使用

最近發現一個pdf中英翻譯的神器zotero-pdf2zh&#xff0c;按照官方安裝教程走一遍的時候&#xff0c;發現一些流程不清楚的問題&#xff0c; 此文就是整理一些安裝需要的文件以及遇到的問題&#xff1a; 相關文件下載地址 Zotero 是一款免費的、開源的文獻管理工具&#xff0…

本地MySQL連接hive

1、首先需要修改MySQL的配置&#xff0c;允許遠程連接&#xff1a; # 在本地MySQL服務器上執行 sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf找到 bind-address 行&#xff0c;將其修改為&#xff1a; bind-address 0.0.0.02、在本地MySQL中創建用戶并授權&#xff08;注意…

Nginx核心功能2

一&#xff1a;正向代理 正向代理&#xff08;Forward Proxy)是一種位于客戶端和原始服務器之間的代理服務器&#xff0c;其主要作用是將客戶端的請求轉發給目標服務器&#xff0c;并將響應返回給客戶端Nginx的正向代理充當客戶端的“中間人”&#xff0c;代表用戶訪問外部資源…

高定電視,一場關于生活方式的覺醒

需要有自己的工作室&#xff0c;雇用3個以上專職模特&#xff0c;至少15名全職員工和20名技術工匠?&#xff1b; 每年都要參加巴黎高級時裝周&#xff0c;展示至少50款原創設計&#xff1b; 使用的面料必須高質量、昂貴且不同尋常&#xff0c;設計上注重細節和個性&#x…

用PyTorch搭建卷積神經網絡實現MNIST手寫數字識別

用PyTorch搭建卷積神經網絡實現MNIST手寫數字識別 在深度學習領域&#xff0c;卷積神經網絡&#xff08;Convolutional Neural Network&#xff0c;簡稱CNN&#xff09;是處理圖像數據的強大工具。它通過卷積層、池化層和全連接層等組件&#xff0c;自動提取圖像特征&#xff…

Tensorrt 基礎入門

什么是tensorrt? 其他廠商: Qualcomm, Hailo, google TPU tensorrt的優劣勢 使用tensorrt的pipeline tensorrt使用中存在的問題以及解決方案 tensorrt的應用場景 自動駕駛模型部署需要關注的問題&#xff1a; 邊端硬件資源有限 散熱&#xff08;不能水冷&#xff09; 實時性&…

Qt 顯示QRegExp 和 QtXml 不存在問題

QRegExp 和 QtXml 問題 在Qt6 中 已被棄用&#xff1b; 1&#xff09;QRegExp 已被棄用&#xff0c;改用 QRegularExpression Qt5 → Qt6 重大變更&#xff1a;QRegExp 被移到了 Qt5Compat 模塊&#xff0c;默認不在 Qt6 核心模塊中。 錯誤類型解決方法QRegExp 找不到改用 Q…

玩玩OCR

一、Tesseract: 1.下載windows版&#xff1a; tesseract 2. 安裝并記下路徑&#xff0c;等會要填 3.保存.py文件 import pytesseract from PIL import Image def ocr_local_image(image_path):try:pytesseract.pytesseract.tesseract_cmd rD:\Programs\Tesseract-OCR\tesse…

Dify 完全指南(一):從零搭建開源大模型應用平臺(Ollama/VLLM本地模型接入實戰)》

文章目錄 1. 相關資源2. 核心特性3. 安裝與使用&#xff08;Docker Compose 部署&#xff09;3.1 部署Dify3.2 更新Dify3.3 重啟Dify3.4 訪問Dify 4. 接入本地模型4.1 接入 Ollama 本地模型4.1.1 步驟4.1.2 常見問題 4.2 接入 Vllm 本地模型 5. 進階應用場景6. 總結 1. 相關資源…

C++ Windows 打包exe運行方案(cmake)

文章目錄 背景動態庫梳理打包方案一、使用 Vcpkg 安裝靜態庫&#xff08;關鍵基礎配置&#xff09;1. 初始化 Vcpkg2. 安裝靜態庫&#xff08;注意 x64-windows-static 后綴&#xff09; 二、CMakeLists.txt 關鍵配置三、編譯四、驗證 不同平臺代碼兼容\_\_attribute\_\_((pack…

Java學習手冊:Hibernate/JPA 使用指南

一、Hibernate 和 JPA 的核心概念 實體&#xff08;Entity&#xff09; &#xff1a;實體是 JPA 中用于表示數據庫表的 Java 對象。通過在實體類上添加 Entity 注解&#xff0c;JPA 可以將實體類映射到數據庫表。例如&#xff0c;定義一個 User 實體類&#xff1a; import ja…

字符串匹配 之 拓展 KMP算法(Z算法)

文章目錄 習題2223.構造字符串的總得分和3031.將單詞恢復初始狀態所需的最短時間 II 靈神代碼模版 區別與KMP算法 KMP算法可用于求解在線性時間復雜度0(n)內求解模式串p在主串s中匹配的未知當然&#xff0c;由于在KMP算法中&#xff0c;預處理求解出了next數組&#xff0c;也就…

安全為上,在系統威脅建模中使用量化分析

*注&#xff1a;Open FAIR? 知識體系是一種開放和獨立的信息風險分析方法。它為理解、分析和度量信息風險提供了分類和方法。Open FAIR作為領先的風險分析方法論&#xff0c;已得到越來越多的大型組織認可。 在數字化風險與日俱增的今天&#xff0c;企業安全決策正面臨雙重挑戰…

游戲引擎學習第259天:OpenGL和軟件渲染器清理

回顧并為今天的內容做好鋪墊 今天&#xff0c;我們將對游戲的分析器進行升級。在之前的修復中&#xff0c;我們解決了分析器的一些敏感問題&#xff0c;例如它無法跨代碼重新加載進行分析&#xff0c;以及一些復雜的小問題。現在&#xff0c;我們的分析器看起來已經很穩定了。…

訊睿CMS模版常用標簽參數匯總

一、模板調用標簽 1、首頁 網站名稱&#xff1a;{SITE_NAME} 標題&#xff1a;{$meta_title}&#xff08;列表頁通用&#xff09; Keywords&#xff1a;{$meta_keywords} Description&#xff1a;{$meta_description}2、列表頁 迅睿cms調用本欄目基礎信息標簽代碼 當前欄目…

【C#】Buffer.BlockCopy的使用

Buffer.BlockCopy 是 C# 中的一個方法&#xff0c;用于在數組之間高效地復制字節塊。它主要用于操作字節數組&#xff08;byte[]&#xff09;&#xff0c;但也可以用于其他類型的數組&#xff0c;因為它直接基于內存操作。 以下是關于 Buffer.BlockCopy 的詳細說明和使用示例&…