Elasticsearch的核心是基于倒排索引惕虑。因此庇忌,我們有必要了解一下倒排索引算法义屏。
簡單的例子
既然有倒排索引但惶,那么也一定有正排索引。
我們以一本書為例湿蛔,每本書都有目錄頁,目錄頁里面的每條記錄都會存儲內(nèi)容的頁碼县爬,我們可以很快地通過頁碼查找到具體的文檔內(nèi)容阳啥。
假如,我們想根據(jù)某些關(guān)鍵詞财喳,查找他們在哪些文檔中出現(xiàn)了察迟,僅僅使用目錄頁可能沒辦法實現(xiàn)。而有的書籍有索引頁耳高,索引頁記錄了文檔關(guān)鍵詞到文檔頁碼的關(guān)聯(lián)關(guān)系扎瓶。這兒的索引頁就是倒排索引。
我們總結(jié)一下:
- 目錄頁 - 正排索引泌枪,文章id到文檔內(nèi)容和單詞的關(guān)聯(lián)概荷。
- 索引頁 - 倒排索引,單詞到文檔內(nèi)容的關(guān)聯(lián)碌燕。
正排和倒排的類比
假如有3本書误证,每本書的id和內(nèi)容都不同,如下所示:
id | Document |
---|---|
1 | ElasticSearch Action |
2 | Mastering ElasticSearch |
3 | ElasticSearch Server |
我們使用倒排索引修壕,可建立如下結(jié)構(gòu):
Term | Count | DocumentId:Position |
---|---|---|
ElasticSearch | 3 | 1:0 2:1 3:0 |
Action | 1 | 1:1 |
Mastering | 1 | 2:0 |
Server | 1 | 3:1 |
其實愈捅,倒排索引由以下內(nèi)容組成
- 單詞詞典 - 所有文檔的單詞,單詞到倒排列表的關(guān)聯(lián)關(guān)系
- 單詞詞典可能會比較大慈鸠,我們可針對它建立單詞索引蓝谨。常使用B+Tree或hash表來實現(xiàn),以提高維護和查詢的性能
- 倒排列表 - 單詞和對應(yīng)的文檔組合,由倒排索引項組成譬巫。每個倒排索引項包含以下內(nèi)容:
- 文檔id
- TF咖楣,詞頻 - 單詞在文檔中出現(xiàn)的次數(shù)÷铺猓可用于相關(guān)性打分
- Position截歉,位置 - 單詞在文檔中分詞的位置⊙塘悖可用于語句搜索
- Offset瘪松,偏移量 - 單詞的開始位置∠前ⅲ可用于高亮顯示
以上面的例子為例宵睦,我們看一下單詞ElasticSearch
的倒排列表是怎樣的。
id | TF | Position | Offset |
---|---|---|---|
1 | 1 | 0 | <0,13> |
2 | 1 | 1 | <10,23> |
3 | 1 | 0 | <0,13> |
Elasticsearch中的倒排索引
- Elasticsearch的json文檔中墅诡,每個字段都可以加入到倒排索引
- 可指定某些字段不做索引
- 優(yōu)點:節(jié)省存儲空間
- 缺點:字段無法被搜索
總結(jié)
我們簡單地對倒排索引進行了說明壳嚎,且未深入將Elasticsearch里面的各種算法。希望通過這篇文章末早,讓讀者對于倒排索引有一個入門級的了解烟馅。