Elasticsearch為什麼速度快之倒排索引?

2021-09-26 02:06:42 字數 2556 閱讀 8374

es的速度快是多方面的原因,此篇博文主要從資料儲存方面來解釋為什麼es的速度快。

es中的乙個shard就是乙個lucene index。

lucene index中有很多小segments, 即為儲存的最小管理單元

為什麼要說明es和lucene之間的關係呢?

因為es是在apache lucene的基礎上開發的,而且倒排索引是在segments的維度上實現的。

其實這個名詞的翻譯給人有種誤解,感覺上是對索引進行了倒排序,但其實不是這樣子的。它的英文原文是:inverted index, 有種顛倒的意思在裡面。 回想我們使用的關係型資料中的索引, 我們是通過索引來定位記錄,倒排索引是根據屬性值來確定記錄的位置。 所以倒排索引也常被稱為反向索引。

如下是lucene中實際的索引結構:

下面我們會一 一講解上述三個概念。

場景: 假設我們有乙個es的集群,並且在該集群中建立了索引people,people具有如下字段:

***, age, height, name
我們向people中插入幾條資料,會有如下的記錄存在於es(省略了一些預設字段):

接下來es會為每個term建立乙個docid列表(posting list)。

posting list 儲存的是所有符合特定term的文件id(在實際的搜尋引擎中儲存的並不都是文件的id,取而代之的是文件id的偏移量,這樣就可以把大資料的儲存轉成小資料的儲存。 例如: 100-》120-》150 變成了100 -》20-》30)。除此之外還包含:文件的數量、詞條在每個文件**現的次數、出現的位置、每個文件的長度、所有文件的平均長度等,在計算相關度時使用。

假設我們的有很多的人員資料,那麼我們的posting list會變得很大,這時候查詢的速度肯定會變慢,於是我們對term進行排序,排序之後使用二分查詢就能更快的查詢出目標,這就是term dictionary。

對於age我們有以下的term dictionary:

18,20,21
使用了二分查詢之後時間複雜度降低到了log n,磁碟的io次數也降低到了log n。

儘管有了term dictionary,但是磁碟的隨機訪問(random access)仍然是昂貴的, 所以為了再次提公升效能,可以考慮把一部分資料直接讀到記憶體中,但是term dictionary又太大了, 全部快取到記憶體是不現實的,於是就有了term index(對term本省進行索引)。

term dictionary是term的有序集合,那麼term index就模擬字典的大章節目錄。

a --

----

----

----

----

--第1頁

ab***x--

----

----

----第2頁

ac***--

----

----

----

-第3頁

b --

----

----

----

----

---第4頁

如果我們的term都是英文,那麼這個term index只需要26個字母就夠了,但實際情況是term可以是任意的byte陣列。而且 26 個英文本元也未必是每乙個字元都有均等的 term,比如 x 字元開頭的 term 可能乙個都沒有,而 s 開頭的 term 又特別多。實際的 term index 是一棵 變種的trie 樹(finite state transducers (fst) 一種有限狀態轉移機)。

trie樹共享的是字首,而fst既共享字首也共享字尾。

優點:空間占用小, 通過對詞典中單詞字首和字尾的重複利用,壓縮了儲存空間。

查詢速度快。o(len(str))的查詢時間複雜度。

對比:

do    dog   does  deep   cost
它們對應的trie樹和fst分別是:

從上面的圖可以看出來term index只保留term的字首和字尾,再加上一系列的壓縮技術(比如前面提到的使用偏移量而不是真正的id),term index可能只有term dictionary的幾十分之一,甚至更少,這樣使得記憶體快取整個term index成為可能。

未完待續。。。。。。。

batch normalization為什麼效果好

batch normalization為什麼效果好 深度學習中 batch normalization為什麼效果好?龍鵬 言有三的回答 知乎 深度學習中 batch normalization為什麼效果好?魏秀參的回答 知乎 為什麼batch normalization那麼有用?autocyz的文章...

為ElasticSearch新增HTTP基本認證

es的http連線沒有提供任何的許可權控制措施,一旦部署在公共網路就容易有資料洩露的風險,尤其是加上類似elasticsearch head這樣友好的前端介面,簡直讓你的資料瞬間裸奔在黑客的眼皮底下。專案上線前做十萬伏特的防護當然不現實,但至少,我們不要裸奔,穿一套比基尼吧。而做乙個簡單的http認...

為什是 property不自動生成屬性?

使用 property 時候,xcode 會自動為我們生 setter 和 getter,甚至會自動生成屬性。例如下面的情況 h 檔案 inte ce person nsobject property copy,nonatomic nsstring name end m 檔案 implementat...