那麽什麽是倒排索引,我們如何理解它呢?
數據檢索的前提條件是我們已經創建了壹個索引庫,並向其中添加了文檔數據。這樣我們就可以按照創建索引庫、添加文檔、數據檢索的順序來了解倒排索引。
首先是創建壹個索引庫。我們之前已經安裝了IK斷字器。這裏我們創建壹個測試索引,它只有壹個內容字段。添加文檔時,字段的分詞模式為ik_max_word,檢索關鍵字時,分詞模式為ik_smart:
字段的分詞方式會影響最終的倒排索引。如果不知道分詞器,可以參考Elasticsearch中文分詞器插件。
既然已經創建了索引,讓我們添加壹段文檔數據:
當添加文檔數據時,ES會根據字段的分詞模式將字段的值拆分成多個術語($ Term)。在創建索引庫時,我們將內容字段的分詞模式指定為ik_max_word,將生成以下術語:
下壹步是建立倒排索引。在此之前,讓我們了解兩個概念:$ Term字典和發布列表:
ES的倒排索引由兩部分組成:壹個條目字典和壹個倒排表。下面是倒排索引的壹個簡單版本。倒排列表項只有與條目對應的文檔id:
壹個條目對應壹個倒排索引條目。ES將為每個字段創建壹個倒排索引。
讓我們添加另壹條文檔數據:
根據上述原則,最終內容字段的倒排索引將被更新為以下結構:
前面已經添加了文檔數據,倒排索引也已經生成。下壹步是檢索數據。在此之前,還有壹個知識點需要了解,那就是$ Term索引,壹般只存儲每個詞條的前綴(第壹個字符),對應的是筆記詞典。之所以需要詞條索引,是因為詞條字典壹般都很大,不適合存放在內存中,而是存放在磁盤中。在檢索數據時,根據關鍵字的前綴匹配詞條索引,然後根據詞條索引定位關鍵字在倒排索引詞條字典中的大概位置,再通過二分搜索法在詞條字典中定位具體詞條,避免了直接遍歷詞條字典指向詞條,大大減少了磁盤的讀取,提高了效率。
定位條目後,可以在倒排索引中找到對應的倒排列表項,然後就知道對應的文檔id了。有了文檔id,自然就能找到文檔,這是ES檢索數據的壹般原理。
如下,我們查詢包含十二個的文檔數據:
我們在創建索引數據庫的時候,指定了檢索時關鍵詞的分詞模式是ik_smart,所以十二被切分後還是十二。結合上述原理,以十二為關鍵字,最終可以找到id為1和2的文檔數據:
這篇文章最好和Elasticsearch中文分詞插件壹起看,這樣可以更容易理解。
新手上路,不合理的地方希望大佬們指出。