倒排索引
倒排索引中有兩個非常重要的概念:
- 文檔(
Document
):用來搜索的數據,其中的每一條數據就是一個文檔。例如一個網頁、一個商品信息 - 詞條(
Term
):對文檔數據或用戶搜索數據,利用某種算法分詞,得到的具備含義的詞語就是詞條。例如:我是中國人,就可以分為:我、是、中國人、中國、國人這樣的幾個詞條
創建倒排索引是對正向索引的一種特殊處理,流程如下:
- 將每一個文檔的數據利用算法分詞,得到一個個詞條
- 創建表,每行數據包括詞條、詞條所在文檔id、位置等信息
- 因為詞條唯一性,可以給詞條創建索引,例如hash表結構索引
如圖:
image-20210720200457207.png
倒排索引的搜索流程如下(以搜索"華為手機"為例):
1)用戶輸入條件"華為手機"
進行搜索。
2)對用戶輸入內容分詞,得到詞條:華為
、手機
。
3)拿著詞條在倒排索引中查找,可以得到包含詞條的文檔id:1、2、3。
4)拿著文檔id到正向索引中查找具體文檔。
如圖:
image-20210720201115192.png
雖然要先查詢倒排索引,再查詢倒排索引,但是無論是詞條、還是文檔id都建立了索引,查詢速度非??欤o需全表掃描。
正向和倒排
那么為什么一個叫做正向索引,一個叫做倒排索引呢?
正向索引是最傳統的,根據id索引的方式。但根據詞條查詢時,必須先逐條獲取每個文檔,然后判斷文檔中是否包含所需要的詞條,是根據文檔找詞條的過程。
而倒排索引則相反,是先找到用戶要搜索的詞條,根據詞條得到保護詞條的文檔的id,然后根據id獲取文檔。是根據詞條找文檔的過程。
是不是恰好反過來了?
那么兩者方式的優缺點是什么呢?
正向索引:
- 優點:
- 可以給多個字段創建索引
- 根據索引字段搜索、排序速度非???/li>
- 缺點:
- 根據非索引字段,或者索引字段中的部分詞條查找時,只能全表掃描。
倒排索引:
- 優點:
- 根據詞條搜索、模糊搜索時,速度非???/li>
- 缺點:
- 只能給詞條創建索引,而不是字段
- 無法根據字段做排序