Elasticsearch搜索優化-自定義路由規劃(routing)

在es的實踐學習中,我覺得它的文檔是最好的老師,所以先把這部分鏈接貼出來,本文只是引導,文檔全是細節,還是推薦大家事后認真看看文檔

Metadata fields-routing

在es搜索中,請求是先分發到所有分片,然后聚合結果返回,如果我們將相同業務領域的數據聚集到同一個或者少部分分片,搜索的時候只搜索這幾個分片,那么將會減少機器壓力,提高搜索性能。

沒有指定路由的情況

在沒有指定路由的情況,所有的數據是依據文檔_id(_routing的默認為_id),然后套公式均勻的分發到分片中,公式如下:

//我這邊用的是7.9.3版本,我看7.17的公式多加了一個num_routing_shards參數,分片算法改進但本質結果沒有變。
shard_num = hash(_routing) % num_primary_shards

從公式中我們可以看到id的不同必然導致文檔會分散到不同的分片中,這就是沒有自定義路由的普遍情況。

指定路由的情況

新建索引

如何指定路由要分析產品需求和數據上的相通性,就拿商品搜索來說,商品分布在不同的門店,而同一門店的商品可能會有列表搜索,有了這么一個需求,那么同一門店的商品是不是放在一個分片里是最好選擇?

分析好需求以后我們確定了針對門店編碼做路由,首先我們簡單建立一個索引

PUT ***/routing{"settings": {"number_of_shards": "3","number_of_replicas": "3","index.routing_partition_size": "2","index.number_of_routing_shards": "3"},"mappings": {"_routing": {"required": true}}
}

除了指定了常見的分片數,副本數,還有兩個新的參數index.routing_partition_size
index.number_of_routing_shards,

index.routing_partition_size

當使用了路由,可以讓路由相同的文檔分配到同一個分片上,從而減少查詢時需要的分片數,提高查詢效率。但是使用該參數容易導致數據不平衡。為此,ES還提供了一個index.routing_partition_size參數,用于將路由相同的文檔映射到不止一個分片上,默認值是1,這樣一方面可以減少查詢的分片數,另一方面又可以在一定程度上防止分片數據不平衡。引入該參數后計算公式如下

shard_num = (hash(_routing) + hash(_id) % routing_partition_size) % num_primary_shards

這個參數只是對上面公式的進一步延申,我在索引參數中設置了2,說明在這個3個分片的索引中,路由相同的文檔分配到其中2個分片上,后面我們導入數據時看看效果。

index.number_of_routing_shards

當在es中使用自定義路由時,路由分片的數量(number_of_routing_shards)決定了有多少分片用于路由。如果不指定此設置,則無論設置的分區大小(routing_partition_size)是多少,都只使用一個分片進行路由。為了確保正確實現分區大小,請將number_of_routing_shards設置為索引中的主分片數(number_of_shards)。這將確保根據指定的路由分片大小(number_of_routing_shards)使用預期數量的分片(number_of_routing_shards)進行路由。

在很多資料中,只提了routing_partition_size但是沒有提number_of_routing_shards,如果不設置number_of_routing_shards,routing_partition_size的作用就會失效,這里著重強調,我在例子中設置了3,跟主分片數量一樣。

Unique IDs with custom routing

其次,mappings里_routing的required值為true,會讓使用自定義路由時,每當保存、獲取、刪除或更新文檔時,都必須提供路由值,否則報錯。我們要明白一點,如果不強制設置這個必填,會導致一條數據在多個分片中出現,沒錯,連_id都會一模一樣,因為在es機制中,不同的路由值下的_id才必須是唯一的。這一條規則(Unique IDs with custom routing)文檔也有寫清。

導入數據

同一個routing隨意導入若干條數據,看看數據分片的情況

插入數據

POST http://***/routing/_doc?routing=107U{"shopCode": "107U"
}

檢查預期結果

查詢分片情況:

GET 
http://***/_cat/shards/routing?v

可以看到在同一個路由的情況下,數據只分布在2個分片中,符合預期。

index   shard prirep state      docs store ip         node
routing 1     p      STARTED      13 5.1kb 10.6.11.20 node-2
routing 1     r      STARTED      13 5.1kb 10.6.11.20 node-1
routing 1     r      STARTED      13 5.1kb 10.6.11.20 node-3                     
routing 2     r      STARTED       7 4.8kb 10.6.11.20 node-2
routing 2     r      STARTED       7 4.8kb 10.6.11.20 node-1
routing 2     p      STARTED       7 4.8kb 10.6.11.20 node-3        
routing 0     r      STARTED       0  208b 10.6.11.20 node-2
routing 0     p      STARTED       0  208b 10.6.11.20 node-1
routing 0     r      STARTED       0  208b 10.6.11.20 node-3              

結語

自定義路由在用戶了解查詢需求和業務的基礎之上,可以對查詢性能進行優化,然而使用不當會導致數據不平衡,重復ID等問題。所以要充分了解其機制再去使用(這里再次推薦看下官方文檔),避免反向優化。

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

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

相關文章

6月26~28日,2024北京國際消防展即將開幕!

隨著社會的快速發展,消防安全日益受到廣大民眾的高度關注。為了進一步推動消防科技的創新與發展,提升全民消防安全意識,2024年北京消防展將于6月26日在北京國家會議中心盛大開展。目前:觀眾預登記已全面啟動,廣大市民和業界人士可…

馬爾科夫性質-舉例簡單說明,馬爾科夫模型和隱馬爾科夫模型在自然語言處理方面應用是什么

目錄 馬爾科夫模型應用 馬爾科夫性質,舉例簡單說明 馬爾科夫模型 馬爾科夫鏈 馬爾科夫決策過程(Markov Decision Process, MDP) 例子 隱馬爾科夫模型(Hidden Markov Model, HMM) 馬爾科夫模型和隱馬爾科夫模型在自然語言處理方面應用是什么 馬爾科夫模型在自然語言…

SQLite3(1):介紹安裝與測試

目錄 1、SQLite3介紹 2、SQLite3的優勢和特性 3、SQLite3安裝與測試 3.1 SQLite3安裝 3.2 SQLite3測試 4、SQLite3簡單使用 4.1 連接數據庫文件 4.2 創建信息表 4.3 插入三個學生信息 4.4 確認信息 5、總結 1、SQLite3介紹 SQLite3是一種輕量級的關系型數據庫管理系…

論文閱讀 A Distributional Framework for Data Valuation

本論文解決的問題 量化數據價值(機器學習模型訓練中各個數據點的貢獻) 避免數據價值受到其所處數據集的影響,使數據點的估值更加穩定、一致 變量假設 假設 D 表示一個在全集 Z 上的數據分布。對于監督學習問題,我們通常認為 Z…

jvm學習筆記(一) ----- JAVA 內存

JAVA 內存 一、程序計數器二、虛擬機棧三、本地方法棧四、堆五、非JAVA內存(堆外內存)1.元空間(Metaspace)2.直接內存 鏈接: jvm學習筆記(二) ----- 垃圾回收 鏈接: jvm學習筆記(三) ----- 垃圾回收器 一、程序計數器 虛擬機需要通過『程序計數器』記錄指令執行到哪了。線程要…

代碼隨想錄算法訓練營day43

題目:1049. 最后一塊石頭的重量 II 、494. 目標和、474.一和零 參考鏈接:代碼隨想錄 1049. 最后一塊石頭的重量 II 思路:本題石頭是相互粉碎,粉碎后剩下的重量就是兩塊石頭之差,我們可以想到,把石頭分成…

使用智譜 GLM-4-9B 和 SiliconCloud 云服務快速構建一個編碼類智能體應用

本篇文章我將介紹使用智譜 AI 最新開源的 GLM-4-9B 模型和 GenAI 云服務 SiliconCloud 快速構建一個 RAG 應用,首先我會詳細介紹下 GLM-4-9B 模型的能力情況和開源限制,以及 SiliconCloud 的使用介紹,最后構建一個編碼類智能體應用作為測試。…

數據結構和算法之數組和鏈表

一、數組 數組是一種線性數據結構,它是由一組連續的內存單元組成的,用于存儲相同類型的數據。在JavaScript中,數組可以包含任意類型的數據,不只限于基本數據類型。 1.存儲方式 在內存中,數組的元素是連續存儲的&…

【Vue】組件的存放目錄問題

注意: .vue文件 本質無區別 組件分類 .vue文件分為2類,都是 .vue文件(本質無區別) 頁面組件 (配置路由規則時使用的組件)復用組件(多個組件中都使用到的組件) 存放目錄 分類開來的…

Llama模型家族之拒絕抽樣(Rejection Sampling)(二)均勻分布簡介

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 基于 LlaMA…

ssti模板注入

一、Flask應用 1、介紹 定義 Flask:是一個使用Python編寫的輕量級web應用框架。Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。 特點 良好的文檔、豐富的插件、包含開發服務器和調試器、集成支持單元測試、RESTful請求調度、支持安全cookies、基于Unicode。 …

手機短信刪除怎么恢復?快速找回的3個秘密武器

手機,這個我們每天離不開的小玩意兒,有時候也會讓我們頭疼不已。比如,你一不小心,或者為了清理點空間,就把那些重要的短信給刪了。這些短信可能是你和好友的深夜聊天,或者是重要的工作信息。一旦刪除&#…

人工智能就業方向有哪些?

人工智能就業方向有哪些? 隨著人工智能技術的不斷發展,其應用領域也越來越廣泛。對于想要進入人工智能領域的年輕人來說,選擇一個合適的職業方向是至關重要的。今天給大家介紹六個熱門的人工智能就業方向,分別是機器學習工程師、自然語言處理…

Webshell檢測初識

最近在研究webshell檢測的小東西,所以開啟一個專門記錄webshell檢測工具開發的專欄,若有遺漏之處,請大佬們指出。 本篇大致了解以下內容 什么是webshll?有哪些類型?各自有什么不同?Webshell有哪些常見的檢測…

鼠標側鍵映射虛擬桌面切換 —— Win11

鼠標側鍵映射虛擬桌面切換 —— Win11 基于 AutoHotkey 實現功能 下載軟件 AutoHotkey建議安裝在默認路徑下(C盤) 此軟件非常小,幾乎不占用資源軟件安裝在默認路徑以外的位置可能導致部分功能不可用 新建一個 .ahk 文件使用記事本打開該 .a…

哪款開放式耳機佩戴最舒服?2024五款備受推崇產品分享!

?在現今耳機市場,開放式耳機憑借其舒適的佩戴體驗和獨特的不入耳設計,備受消費者追捧。它們不僅讓你在享受音樂時,仍能察覺周圍的聲音,確保與人交流無障礙,而且有利于耳朵的衛生與健康。對于運動愛好者和耳機發燒友而…

GIGE 協議摘錄 —— 引導寄存器(四)

系列文章目錄 GIGE 學習筆記 GIGE 協議摘錄 —— 設備發現(一) GIGE 協議摘錄 —— GVCP 協議(二) GIGE 協議摘錄 —— GVSP 協議(三) GIGE 協議摘錄 —— 引導寄存器(四) GIGE 協議…

Flutter Dismissible 屬性介紹及使用指南

在移動應用開發中,滑動刪除是一種常見的交互方式。Flutter 提供了一個強大的小部件 Dismissible,使得實現這一功能變得非常簡單。本文將介紹 Dismissible 的主要屬性及其使用方法。 1. Dismissible 簡介 Dismissible 是一個 Flutter 小部件&#xff0c…

前后端實現文件上傳進度條-實時進度

后端接口代碼&#xff1a; PostMapping("/upload")public ResponseEntity<String> handleFileUpload(RequestParam("file") MultipartFile file) {try {// 獲取文件名String fileName file.getOriginalFilename();// 創建上傳目標路徑Path targetPa…

基于簡單Agent對醫療數據進行分析

數據表 供應商資格審核規定.pdf 醫生名錄.xlsx 歷史就診記錄.xlsx 患者信息名錄.xlsx 藥品.xlsx 藥品庫存管理.xlsx 采購單位基本信息.xlsx Agent測試 模型基于ChatGPT-3.5 問題&#xff1a;幫我找出不達標的供應商 Agent分析過程 [Thought: 0] Key Concepts: - 不達標的供…