那什麽是倒排索引,我們該如何理解它呢?
我們能進行數據檢索的前提條件是,已經創建好了索引庫,並給裏邊添加了文檔數據。所以我們可以按照 創建索引庫 、 添加文檔 、 數據檢索 這個順序來認識倒排索引。
首先是創建索引庫,我們之前已經安裝好了 IK 分詞器,這裏我們創建壹個 test 索引,它只有壹個 content 字段,添加文檔時字段的分詞模式是 ik_max_word ,檢索時關鍵字的分詞模式是 ik_smart :
字段的分詞模式會影響最終生成的倒排索引。不了解分詞器的可以參考 Elasticsearch 中文分詞器插件 。
創建好了索引,我們來添加壹條文檔數據:
添加文檔數據時,ES 會根據字段的分詞模式將字段的值拆分成多個 詞條 (Term)(或者稱作詞項),創建索引庫時我們指定了 content 字段分詞模式為 ik_max_word ,則會生成如下的詞條:
接下來就是建立倒排索引了,在這之前我們先了解兩個概念 詞條字典 (Term Dictionary)、 倒排列表 (Posting List):
ES 的倒排索引就是由 詞條字典 和 倒排列表 兩部分組成的。如下就是壹個簡易版的倒排索引,倒排列表項只有詞條對應的文檔 id:
壹個詞條對應壹個倒排索引項。ES 會給每個字段都建立壹個倒排索引。
我們再添加壹條文檔數據:
根據上邊的原理,最終 content 字段的倒排索引會被更新成如下結構:
前邊已經添加了文檔數據,同時也生成了倒排索引,接下來就是檢索數據了。在這之前還有壹個知識點需要了解,那就是 詞條索引 (Term Index),詞條索引壹般只存儲各個 詞條 的前綴(第壹個字符),它和字條字典對應。之所以需要詞條索引,是因為 詞條字典 壹般都很大,不適合保存在內存中而是存儲在磁盤中,檢索數據時根據關鍵字的前綴匹配到詞條索引,再根據詞條索引定位到關鍵字在倒排索引的詞條字典中大致的位置,然後進壹步在詞條字典中通過二分查找定位到具體的詞條,這樣避免了直接遍歷詞條字典來點位詞條,大幅減少了磁盤的讀取,提高了效率。
定位到了詞條,就能在倒排索引中找到對應的倒排列表項,進而就知道了對應的文檔 id,有了文檔 id 自然也就找到了文檔,這也就是 ES 檢索數據大致的原理。
如下我們查詢包含 十二 的文檔數據:
由於我們創建索引庫時指定了檢索時關鍵字的分詞模式是 ik_smart ,所以 十二 被分詞後還是 十二 ,再結合上邊的原理,以 十二 為關鍵字最終可以查詢到 id 為 1、2 的文檔數據:
這篇最好能結合 Elasticsearch 中文分詞器插件 壹起看,這樣能更容易理解些。
新手上路,不合理的地方還望大佬指點。