es查詢大文本效率_es之路由:進一步提高Elasticsearch的檢索效率(適用大規模數據集)...

1:一條數據是如何落地到對應的shard上的

當索引一個文檔的時候,文檔會被存儲到一個主分片中。 Elasticsearch 如何知道一個文檔應該存放到哪個分片中呢?

首先這肯定不會是隨機的,否則將來要獲取文檔的時候我們就不知道從何處尋找了。實際上,這個過程是根據下面這個算法決定的:

shard = hash(routing) % number_of_primary_shards

routing 是一個可變值,默認是文檔的 _id ,也可以設置成一個自定義的值。 routing 通過 hash 函數生成一個數字,然后這個數字再除以 number_of_primary_shards (主分片的數量)后得到 余數 。這個分布在 0 到 number_of_primary_shards-1 之間的余數,就是我們所尋求的文檔所在分片的位置。

這就解釋了為什么我們要在創建索引的時候就確定好主分片的數量并且永遠不會改變這個數量:因為如果數量變化了,那么所有之前路由的值都會無效,文檔也再也找不到了

2:路由機制

現在我們在探討一個關于路由的問題:

假設你有一個100個分片的索引。當一個請求在集群上執行時會發生什么呢?

1. 這個搜索的請求會被發送到一個節點

2. 接收到這個請求的節點,將這個查詢廣播到這個索引的每個分片上(可能是主分片,也可能是復制分片)

3. 每個分片執行這個搜索查詢并返回結果

4. 結果在通道節點上合并、排序并返回給用戶

因為默認情況下,Elasticsearch使用文檔的ID(類似于關系數據庫中的自增ID),如果插入數據量比較大,文檔會平均的分布于所有的分片上,這導致了Elasticsearch不能確定文檔的位置,所以它必須將這個請求廣播到所有的N個分片上去執行

這種操作會給集群帶來負擔,增大了網絡的開銷;

路由使用:

PUT my_index/my_type/1?routing=user1&refresh=true

{

"title": "This is a document"

}

?

GET my_index/my_type/1?routing=user1

?

?

上面的代碼中,指定了一個用戶屬性作為路由進行分區,然后查詢的時候也必須指定路由。這一點需要注意 只要在索引時候加入路由字段,那么在以后的get,delete,update操作中都必須使用路由字段,否則會出現問題。

有時候我們會把某些具有相似屬性的數據放在同一個路由下,這樣可以提高查詢的效率;比如:我們把不同季度的銷售數據存儲在不同的路由下;然后在查詢的時候,直接根據路由字段本身進行查詢即可,而不需要直接掃描全年的數據:

PUT department1/order/1?routing=jidu1

{

"productName" : "phone",

"total_price" : 10000000,

"times" : "2017-01-01"

}

?

PUT department1/order/2?routing=jidu1

{

"productName" : "huawei",

"total_price" : 10000000,

"times" : "2017-2-01"

}

PUT department1/order/1?routing=jidu2

{

"productName" : "phone",

"total_price" : 10009000,

"times" : "2017-5-01"

}

?

查詢季度1的所有數據

GET department1/_search

{

"query": {

"terms" : {

"_routing" : [ "jidu1" ]

}

}

}

?

查詢季度1和季度2的所有數據:

GET department1/_search

{

"query": {

"terms": {

"_routing": [ "jidu1" , "jidu2"]

}

}

}

?

當然,有時候我們需要查詢第一、第二季度的產品中叫做huawei的文檔。那么在查詢中也是可以指定多個路由的:

GET department1/_search?routing=jidu1,jidu2

{

"query": {

"match": {

"productName": "huawei"

}

}

}

?

注意:

如果加入路由字段之后,其他的操作(indexing,getting,deleting,updating)都必須指定路由字段,為了避免在使用時忘記添加 路由字段,導致同類數據會分布在多個shard上,這就違反了路由的原則,我們可以在mapping中 設置路由字段是必須字段,否則會提示錯誤:

PUT department1

{

"mappings": {

"order": {

"_routing": {

"required": true

}

}

}

}

?

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

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

相關文章

pyhton數據類型

列表使用場景 列表就是java中的數組 元組用 ()表示 元組的元素不能修改 元組和列表之間的轉換 字典 使用 {}表示 合并字典 清空字典 遍歷字典 字符串

好程序員應該擁有的7個特質

一個好的程序員應該擁有的10大特質,你符合哪些呢?1、喜歡研究無論你怎么稱呼它,你可能遇到的大多數編程問題幾乎在一定形式上都已經被解決了。傳道書早就記錄在案,陽光底下無新事。在GitHub上的庫文件列表中,在互聯網上…

最大全零子矩陣

【題目描述】在一個0,1方陣中找出其中最大的全0子矩陣&#xff0c;所謂最大是指0的個數最多。 【輸入描述】輸入第一行為整數N&#xff0c;其中1<N<2000&#xff0c;為方陣的大小&#xff0c;緊接著N行每行均有N個0或1&#xff0c;相鄰兩數間嚴格用一個空格隔開。 【輸出…

微機原理換行代碼_設置段落樣式的標記中,用來換行的標記是:

【判斷題】( )經檢驗,收退貨品為良品,退貨上架員用RF終端設備掃描,并根據指示進行良品入庫作業。【單選題】Web of Science中,SAME算符()。【多選題】在進行人員培訓時必須考慮的事項有( )。【單選題】在PubMed-MeSH檢索界面中,輸入檢索詞tongue cancer,點擊“Search”,查詢結果…

谷歌瀏覽器添加插件時顯示程序包無效:CRX_HEADER_INVALID 解決辦法

在添加谷歌插件的時候&#xff0c;發現谷歌瀏覽器顯示 程序包無效&#xff1a;"CRX_HEADER_INVALID" 解決方法如下&#xff1a; 下圖是下載好的 .crx 結尾的插件。 將插件的后綴名改為.rar &#xff0c;如下圖。 解壓 接下來就是瀏覽器添加插件&#xff0c;打開到瀏…

推薦VSCode12個比較實用的插件

1、Auto Rename Tag?——自動重命名成對的HTML標記。假如你創建了一個<p>標記。現在你想更改它。有了這個軟件&#xff0c;你只需要更改一個就行&#xff0c;另一個會自動修改。從理論上來說&#xff0c;使用這個軟件可以把你的工作效率提升一倍。2、HTML CSS Support?…

[單選題]$array = array('a','b','c','d'); $array_now = array_splice($array,2); print_r($array_now);...

Array ( [0] > c [1] > d ) Array ( [0] > a [1] > c ) Array ( [0] > b [1] > d ) Array ( [0] > a [1] > b )PHP array_splice() 函數 PHP Array 函數 實例 從數組中移除元素&#xff0c;并用新元素取代它&#xff1a; <?php $a1array("a&q…

圖論解油瓶分油問題_一個很有趣的de novo圖論算法

首先&#xff0c;小編先給大家介紹一些關于組裝的歷史。大家肯定也知道&#xff0c;這個組裝技術的發展是依賴于測序技術的。首先在一代測序的時候&#xff0c;測序數據量較少&#xff0c;成本較高&#xff0c;人們對于組裝的結首先&#xff0c;小編先給大家介紹一些關于組裝的…

pip show pip可以查看pip的版本以及升級pip到最新版本

輸入命令&#xff1a;pip show pip可以查看pip的版本&#xff0c;如果不是最新版最后會有提示如下&#xff1a; 輸入命令&#xff1a;python -m pip install --upgrade pip可以升級pip到最新版本。

盤點程序員開發遇到的30個問題

1、我不知道該刪掉還是重寫回歸曾經寫的源代碼&#xff0c;總有一種想要重新返工的沖動&#xff0c;邏輯性差&#xff0c;冗余代碼多&#xff0c;讓人難以理解。但是&#xff0c;如果功能沒出現問題&#xff0c;千萬不要去修改。這是我經常要面對的困擾&#xff0c;相信也困擾了…

20159320《網絡攻防實踐》第5周教材總結

web應用程序安全攻防 應用程序體系結構以及其安全威脅 1、三層架構&#xff1a;表示層、業務邏輯層和數據層 2、體系結構&#xff1a;瀏覽器、web服務器、web應用程序、數據庫、傳輸協議HTTP/HTTPS 3、web應用安全威脅&#xff1a;針對瀏覽器和終端用戶的web瀏覽安全、針對傳輸…

saas是什么意思_為什么越來越多的人選擇SaaS模式的crm客戶管理系統?

SaaS近幾年在國內逐漸升溫&#xff0c;很多企業管理者都開始了解SaaS是什么意思&#xff0c;SaaS是企業根據需要&#xff0c;從SaaS提供商獲取軟件使用權的&#xff0c;直接通過互聯網就可進行操作。對于我國大多數中小企業來說&#xff0c;選擇SaaS模式的crm客戶管理系統也許是…

趣漫揭秘!中國程序員生存現狀?

如果沒有程序員&#xff0c;整個虛擬世界都會消失不見。全中國7億多網民&#xff0c;再也不能愉快滴發自拍&#xff0c;看視頻&#xff0c;打游戲&#xff0c;甚至連打電話都成了一種幻想。絕大部分電子設備都會變成廢鐵&#xff0c;人類的生活將完全倒退到70多年以前。程序員貢…

一個App完成入門篇(五)- 完成新聞頁面

本節教程將介紹如何用DeviceOne簡單而高效的完成一個新聞頁面。 導入項目數據模板分離MVVM模型自定義事件展示新聞九宮格展示將要學習的demo效果圖如下所示 1. 導入完整項目 本節示例demo請參考下載地址&#xff0c;可以導入到設計器中學習。 為了方便大家理解頁面結構&#xf…

程序員職業規劃

每個程序員的職業生涯無非以下幾種情況&#xff1a;一、幫別人掙錢&#xff08;打工&#xff09;不管你是剛入職的小兵&#xff0c;還是管人的經理&#xff0c;甚至是唬人的總監&#xff0c;都屬于這一階段。通常程序員在這一階段的職業發展分兩條線&#xff0c;專家&#xff0…

python getattrribute_python操作對象屬性

getattrgetattr(a,b)的作用就和a.b是一樣的。那么這個內建函數有什么作用呢&#xff0c;最方便的無疑是使用它來實現工廠方法(Factory Method)模式。參數說明&#xff1a;object&#xff1a;對象的實例name&#xff1a;字符串&#xff0c;對象的成員函數的名字或者成員變量defa…

電腦處理器i5和i7的區別,如何選擇?

對于好多正在準備入手筆記本的朋友們來說&#xff0c;電腦的配置參數真的是讓人眼花繚亂&#xff0c;一些看不懂的數字和英文碼看得人心煩&#xff0c;i5和i7的區別究竟在哪里那&#xff1f;處理器中央處理器&#xff08;英文Central ProcessingUnit&#xff0c;CPU&#xff09…

c++ map的存儲結構_「軟帝學院」java集合類框架map及相關常見問題二

Map接口 通過查看Map接口描述&#xff0c;發現Map接口下的集合與Collection接口下的集合&#xff0c;它們存儲數據的形式不同&#xff0c;如下圖。 Collection中的集合&#xff0c;元素是孤立存在的(理解為單身)&#xff0c;向集合中存儲元素采用一個個元素的方式存儲。 Map中的…

Windows 下 Conda install 安裝出現CondaHTTPError: HTTP 000 CONNECTION FAILED for url解決措施

在使用Conda install 安裝庫的時候出現以下錯誤 原因是使用的是國外的鏡像&#xff0c;切換至國內鏡像就可以解決啦 在cmd 中輸入下面命令 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --set show_channel_urls yes…