基礎知識儲備 搜尋 ES

2021-09-24 17:00:35 字數 3237 閱讀 6764

應用:

github 使用 elasticsearch 對1300億行**進行查詢

愛奇藝使用es作為資料庫儲存

介紹:集群中的節點通過埠 9300 彼此通訊。如果這個埠沒有開啟,節點將無法形成乙個集群

所有其他語言可以使用 restful api 通過埠 9200 和 elasticsearch 進行通訊

elasticsearch 盡可能地遮蔽了分布式系統的複雜性。這裡列舉了一些在後台自動執行的操作:

乙個執行中的 elasticsearch 例項稱為乙個 節點,而集群是由乙個或者多個擁有相同cluster.name配置的節點組成, 它們共同承擔資料和負載的壓力。當有節點加入集群中或者從集群中移除節點時,集群將會重新平均分布所有的資料。

當乙個節點被選舉成為 主 節點時, 它將負責管理集群範圍內的所有變更,例如增加、刪除索引,或者增加、刪除節點等。 而主節點並不需要涉及到文件級別的變更和搜尋等操作,所以當集群只擁有乙個主節點的情況下,即使流量的增加它也不會成為瓶頸。

作為使用者,我們可以將請求傳送到 集群中的任何節點 ,包括主節點。 每個節點都知道任意文件所處的位置,並且能夠將我們的請求直接**到儲存我們所需文件的節點。 無論我們將請求傳送到哪個節點,它都能負責從各個包含我們所需文件的節點收集回資料,並將最終結果返回給客戶端。 elasticsearch 對這一切的管理都是透明的。

green

所有的主分片和副本分片都正常執行。

yellow

所有的主分片都正常執行,但不是所有的副本分片都正常執行。

red

有主分片沒能正常執行。

儲存資料到 elasticsearch 的行為叫做 索引 

乙個文件中的每乙個屬性都是 被索引 的(有乙個倒排索引)和可搜尋的。乙個沒有倒排索引的屬性是不能被搜尋到的

索引實際上是指向乙個或者多個物理 分片 的 邏輯命名空間 。

elasticsearch 是利用分片將資料分發到集群內各處的。分片是資料的容器,文件儲存在分片內,分片又被分配到集群內的各個節點裡。 當你的集群規模擴大或者縮小時, elasticsearch 會自動的在各節點中遷移分片,使得資料仍然均勻分布在集群裡。

分片是乙個功能完整的搜尋引擎,它擁有使用乙個節點上的所有資源的能力乙個分片可以是 主 分片或者 副本 分片。 索引內任意乙個文件都歸屬於乙個主分片,所以主分片的數目決定著索引能夠儲存的最大資料量。

乙個副本分片只是乙個主分片的拷貝。 副本分片作為硬體故障時保護資料不丟失的冗餘備份,並為搜尋和返回文件等讀操作提供服務。

在索引建立的時候就已經確定了主分片數,但是副本分片數可以隨時修改。

所有新近被索引的文件都將會儲存在主分片上,然後被並行的複製到對應的副本分片上

自動生成的 id 是 url-safe、 基於 base64 編碼且長度為20個字元的 guid 字串。 這些 guid 字串由可修改的 flakeid 模式生成,這種模式允許多個節點並行生成唯一 id ,且互相之間的衝突概率幾乎為零。

shard = hash(routing) % number_of_primary_shards
routing是乙個可變值,預設是文件的_id,也可以設定成乙個自定義的值。routing通過 hash 函式生成乙個數字,然後這個數字再除以number_of_primary_shards(主分片的數量)後得到餘數。這個分布在0number_of_primary_shards-1之間的餘數,就是我們所尋求的文件所在分片的位置。

第一步是廣播請求到索引中每乙個節點的分片拷貝。就像 documentgetrequests 所描述的, 查詢請求可以被某個主分片或某個副本分片處理, 這就是為什麼更多的副本(當結合更多的硬體)能夠增加搜尋吞吐率。 協調節點將在之後的請求中輪詢所有的分片拷貝來分攤負載。

每個分片在本地執行查詢請求並且建立乙個長度為from + size的優先佇列—也就是說,每個分片建立的結果集足夠大,均可以滿足全域性的搜尋請求。 分片返回乙個輕量級的結果列表到協調節點,它僅包含文件 id 集合以及任何排序需要用到的值,例如_score

協調節點將這些分片級的結果合併到自己的有序優先佇列裡,它代表了全域性排序結果集合。至此查詢過程結束。

當索引乙個文件的時候,elasticsearch 取出所有欄位的值拼接成乙個大的字串,作為_all字段進行索引。

倒排索引:elasticsearch 使用一種稱為 倒排索引 的結構,它適用於快速的全文搜尋。乙個倒排索引由文件中所有不重複詞的列表構成,對於其中每個詞,有乙個包含它的文件列表。

自定義動態對映,避免新字段對映錯誤:

put /my_index

}},}}

]}}}

零停機從舊索引遷移到新索引

post /_aliases

}, }]}

elasticsearch 增加了乙個 translog ,或者叫事務日誌,在每一次對 elasticsearch 進行操作時均進行了日誌記錄。translog 提供所有還沒有被刷到磁碟的操作的乙個持久化紀錄。當 elasticsearch 啟動的時候, 它會從磁碟中使用最後乙個提交點去恢復已知的段,並且會重放 translog 中所有在最後一次提交後發生的變更操作。

translog 也被用來提供實時 crud 。當你試著通過id查詢、更新、刪除乙個文件,它會在嘗試從相應的段中檢索之前, 首先檢查 translog 任何最近的變更。這意味著它總是能夠實時地獲取到文件的最新版本。

4 Map基礎知識儲備

之前list中的陣列和鍊錶,查詢某個元素都存在乙個問題,需要遍歷所有元素,直到找到元素為止,效率比較低。而雜湊表則是不在意儲存順序,只希望快速找到元素。每個物件計算雜湊碼,根據雜湊碼儲存在對應的位置上。出現雜湊衝突的時候就往鍊錶上新增,元素衝突的多的話轉為紅黑樹。如果雜湊表太滿,需要再雜湊,建立乙個...

es6基礎知識

1 箭頭操作符 var arr 1,5,6 傳統寫法 arr.foreach function v 箭頭操作符 arr.foreach v console.log v 2 字串模板 var str math.random console.log you num is 3 解構 函式解構 var x,...

ACM基礎知識儲備 快速篩法求素數

求素數是程式設計比賽中經常遇到的問題,最基本的方法是通過素數的定義直接判斷,只能被1和它本身整除的數就是素數了。這種方法適合判斷單個數是否為素數,當要求乙個範圍內素數而這個範圍又比較大時,這種方法就不太使用了,甚至程式要執行幾分鐘才能算出結果。篩法的思想是去除要求範圍內所有的合數,剩下的就是素數了,...