初识ES-倒排索引
倒排索引
倒排索引的概念是基于MySQL這樣的正向索引而言的。
正向索引
那么什么是正向索引呢?例如給下表(tb_goods)中的id創(chuàng)建索引:
如果是根據(jù)id查詢,那么直接走索引,查詢速度非常快。
但如果是基于title做模糊查詢,只能是逐行掃描數(shù)據(jù),流程如下:
1)用戶搜索數(shù)據(jù),條件是title符合"%手機(jī)%"
2)逐行獲取數(shù)據(jù),比如id為1的數(shù)據(jù)
3)判斷數(shù)據(jù)中的title是否符合用戶搜索條件
4)如果符合則放入結(jié)果集,不符合則丟棄。回到步驟1
逐行掃描,也就是全表掃描,隨著數(shù)據(jù)量增加,其查詢效率也會(huì)越來(lái)越低。當(dāng)數(shù)據(jù)量達(dá)到數(shù)百萬(wàn)時(shí),就是一場(chǎng)災(zāi)難。
倒排索引
倒排索引中有兩個(gè)非常重要的概念:
-
文檔(Document):用來(lái)搜索的數(shù)據(jù),其中的每一條數(shù)據(jù)就是一個(gè)文檔。例如一個(gè)網(wǎng)頁(yè)、一個(gè)商品信息
-
詞條(Term):對(duì)文檔數(shù)據(jù)或用戶搜索數(shù)據(jù),利用某種算法分詞,得到的具備含義的詞語(yǔ)就是詞條。例如:我是中國(guó)人,就可以分為:我、是、中國(guó)人、中國(guó)、國(guó)人這樣的幾個(gè)詞條
創(chuàng)建倒排索引是對(duì)正向索引的一種特殊處理,流程如下:
-
將每一個(gè)文檔的數(shù)據(jù)利用算法分詞,得到一個(gè)個(gè)詞條
-
創(chuàng)建表,每行數(shù)據(jù)包括詞條、詞條所在文檔id、位置等信息
-
因?yàn)樵~條唯一性,可以給詞條創(chuàng)建索引,例如hash表結(jié)構(gòu)索引
如圖:
倒排索引的搜索流程如下(以搜索"華為手機(jī)"為例):
1)用戶輸入條件"華為手機(jī)"進(jìn)行搜索。
2)對(duì)用戶輸入內(nèi)容分詞,得到詞條:華為、手機(jī)。
3)拿著詞條在倒排索引中查找,可以得到包含詞條的文檔id:1、2、3。
4)拿著文檔id到正向索引中查找具體文檔。
如圖:
?雖然要先查詢倒排索引,再查詢倒排索引,但是無(wú)論是詞條、還是文檔id都建立了索引,查詢速度非常快!無(wú)需全表掃描。
正向和倒排
那么為什么一個(gè)叫做正向索引,一個(gè)叫做倒排索引呢?
-
正向索引是最傳統(tǒng)的,根據(jù)id索引的方式。但根據(jù)詞條查詢時(shí),必須先逐條獲取每個(gè)文檔,然后判斷文檔中是否包含所需要的詞條,是根據(jù)文檔找詞條的過(guò)程。
-
而倒排索引則相反,是先找到用戶要搜索的詞條,根據(jù)詞條得到保護(hù)詞條的文檔的id,然后根據(jù)id獲取文檔。是根據(jù)詞條找文檔的過(guò)程。
是不是恰好反過(guò)來(lái)了?
那么兩者方式的優(yōu)缺點(diǎn)是什么呢?
正向索引:
-
優(yōu)點(diǎn):
-
可以給多個(gè)字段創(chuàng)建索引
-
根據(jù)索引字段搜索、排序速度非常快
-
-
缺點(diǎn):
-
根據(jù)非索引字段,或者索引字段中的部分詞條查找時(shí),只能全表掃描。
-
倒排索引:
-
優(yōu)點(diǎn):
-
根據(jù)詞條搜索、模糊搜索時(shí),速度非???/p>
-
-
缺點(diǎn):
-
只能給詞條創(chuàng)建索引,而不是字段
-
無(wú)法根據(jù)字段做排序
-
總結(jié)
- 上一篇: 初识ES-什么是elasticsearc
- 下一篇: 初识ES-安装es