倒排索引
倒排索引中有兩個(gè)非常重要的概念:
- 文檔(
Document
):用來搜索的數(shù)據(jù)悯舟,其中的每一條數(shù)據(jù)就是一個(gè)文檔。例如一個(gè)網(wǎng)頁砸民、一個(gè)商品信息 - 詞條(
Term
):對文檔數(shù)據(jù)或用戶搜索數(shù)據(jù)抵怎,利用某種算法分詞,得到的具備含義的詞語就是詞條岭参。例如:我是中國人反惕,就可以分為:我、是演侯、中國人姿染、中國、國人這樣的幾個(gè)詞條
創(chuàng)建倒排索引是對正向索引的一種特殊處理蚌本,流程如下:
- 將每一個(gè)文檔的數(shù)據(jù)利用算法分詞盔粹,得到一個(gè)個(gè)詞條
- 創(chuàng)建表,每行數(shù)據(jù)包括詞條程癌、詞條所在文檔id舷嗡、位置等信息
- 因?yàn)樵~條唯一性,可以給詞條創(chuàng)建索引嵌莉,例如hash表結(jié)構(gòu)索引
如圖:
倒排索引的搜索流程如下(以搜索"華為手機(jī)"為例):
1)用戶輸入條件"華為手機(jī)"
進(jìn)行搜索进萄。
2)對用戶輸入內(nèi)容分詞,得到詞條:華為
、手機(jī)
中鼠。
3)拿著詞條在倒排索引中查找可婶,可以得到包含詞條的文檔id:1、2援雇、3矛渴。
4)拿著文檔id到正向索引中查找具體文檔。
如圖:
雖然要先查詢倒排索引惫搏,再查詢倒排索引具温,但是無論是詞條、還是文檔id都建立了索引筐赔,查詢速度非诚承桑快!無需全表掃描茴丰。
正向和倒排
那么為什么一個(gè)叫做正向索引达皿,一個(gè)叫做倒排索引呢?
正向索引是最傳統(tǒng)的贿肩,根據(jù)id索引的方式峦椰。但根據(jù)詞條查詢時(shí),必須先逐條獲取每個(gè)文檔尸曼,然后判斷文檔中是否包含所需要的詞條们何,是根據(jù)文檔找詞條的過程萄焦。
而倒排索引則相反控轿,是先找到用戶要搜索的詞條,根據(jù)詞條得到保護(hù)詞條的文檔的id拂封,然后根據(jù)id獲取文檔茬射。是根據(jù)詞條找文檔的過程。
是不是恰好反過來了冒签?
那么兩者方式的優(yōu)缺點(diǎn)是什么呢在抛?
正向索引:
- 優(yōu)點(diǎn):
- 可以給多個(gè)字段創(chuàng)建索引
- 根據(jù)索引字段搜索、排序速度非诚羲。快
- 缺點(diǎn):
- 根據(jù)非索引字段刚梭,或者索引字段中的部分詞條查找時(shí),只能全表掃描票唆。
倒排索引:
- 優(yōu)點(diǎn):
- 根據(jù)詞條搜索朴读、模糊搜索時(shí),速度非匙咔鳎快
- 缺點(diǎn):
- 只能給詞條創(chuàng)建索引衅金,而不是字段
- 無法根據(jù)字段做排序