這個問題是近段時間被問的最多的,理清思路就更好理解了,下面貼出來漏益,也配合表格輔助理解蛹锰。
其實很多搜索引擎都是基于倒排索引,比如luncene遭庶,solr以及elasticsearch?
正排索引
聊倒排搜索之前先來看看正排索引宁仔,正排其實就是數(shù)據(jù)庫表,他通過id和數(shù)據(jù)進行關(guān)聯(lián)峦睡,如下:
[圖片上傳失敗...(image-c3ad8c-1690871925538)]
我們可以通過搜索id翎苫,來獲得相應(yīng)的數(shù)據(jù),也能刪除數(shù)據(jù)榨了。你買了一本書煎谍,書的目錄其實也是正排搜索。
假設(shè)現(xiàn)在我要搜蘋果倆字龙屉,那么他會對這張表格中每一行的數(shù)據(jù)做匹配呐粘,去查找一下,是否包含蘋果這兩個字转捕,從第一條匹配到最后一條作岖,如果一張表中數(shù)據(jù)量不多,幾萬五芝,十幾萬痘儡,那么問題不大,但是一旦數(shù)據(jù)量有上百萬枢步,上千萬沉删,那么全表掃描這種的搜索性能就會有影響缅糟。
其次毯侦,這個時候我想搜索蘋果iPhone,那么我們無法把這詞匯拆開再到數(shù)據(jù)庫去搜索酵镜。
- 優(yōu)點:使用起來方便隘擎,原理也簡單殴穴,比較入門,典型的數(shù)據(jù)庫檢索方式
- 缺點:檢索效率低下嵌屎,適合簡單場景使用推正,比如傳統(tǒng)項目,數(shù)據(jù)量較小的項目宝惰。不支持分詞搜索植榕。
倒排索引
與正排相比是反著來的,他會把文檔內(nèi)容進行分詞尼夺,比如“蘋果公司發(fā)布iPhone”是一個文檔數(shù)據(jù)尊残,當(dāng)我們把他存入到搜索引擎中去的時候炒瘸,會有一個文檔id,這個文檔id就類似于數(shù)據(jù)庫主鍵寝衫。但是這文檔存儲的時候和數(shù)據(jù)庫不一樣顷扩,他會進行一個分詞,參照上面的表格慰毅,分詞后的結(jié)果如下:
[圖片上傳失敗...(image-215548-1690871925538)]
每一個詞匯都會和文檔id關(guān)聯(lián)起來隘截,可以根據(jù)詞匯來找到所有出現(xiàn)的id列表,如下:
[圖片上傳失敗...(image-b3fbca-1690871925538)]
假設(shè)現(xiàn)在我要搜索iPhone汹胃,如果是數(shù)據(jù)庫搜索婶芭,假設(shè)有1億條數(shù)據(jù),那么會匹配1億次着饥,全表掃描犀农。最后再把數(shù)據(jù)返回出來。
如果是搜索引擎宰掉,那么有可能第一次就把所有文檔數(shù)據(jù)給查出來呵哨,當(dāng)然也有可能是第N次,當(dāng)然他肯定要比數(shù)據(jù)庫的搜索效率更高轨奄。如圖中位置孟害,他會直接把1001,1003兩個文檔返回挪拟。
可能會有同學(xué)會問纹坐,數(shù)據(jù)庫和搜索引擎都是1000萬數(shù)據(jù),搜索的詞匯在搜索引擎中正好是第1000萬條舞丛,那么會不會慢,其實這個肯定會比數(shù)據(jù)庫更快果漾,數(shù)據(jù)庫要匹配是一個文本中的內(nèi)容和關(guān)鍵詞匹配球切,而搜索引擎是直接把關(guān)鍵字做匹配,效率肯定后者更快绒障。
- 優(yōu)點:搜索更快吨凑,耗時短,用戶體驗高户辱,精準(zhǔn)度也高
- 缺點:維護成本高鸵钝,索引新建后要修改,必須先刪除庐镐,前期需要很好地規(guī)劃