搜索的一般过程
??之前學(xué)習(xí)過很多劉老師的lucene源碼分析的課程,結(jié)果現(xiàn)在整的都忘了,這次重新梳理一下爭取形成自己的東西。
后面就不容易忘掉了。
??劉老師的課程是基于lucene2.x的源碼分析的,后面lucene迭代了很多版本,也引入了新的數(shù)據(jù)結(jié)構(gòu)進(jìn)行優(yōu)化,但是主體的模塊基本上是沒有變的。計劃是先把之前的lunce的數(shù)據(jù)結(jié)構(gòu)整理一下,因為可以查閱劉老師的課程,可以有很好的參考作用。在這個基礎(chǔ)上再整理和對比新的lucene的優(yōu)化點(diǎn),基于lucene7.x在這里主要關(guān)注lucene的存儲結(jié)構(gòu),因為了解了存儲結(jié)構(gòu)基本上就了解了大體的實(shí)現(xiàn)。
1. 搜索的概覽
搜索主要是解決用戶基于文本進(jìn)行搜索的問題。比如在很多本書中搜索一些內(nèi)容,或者搜索一些帖子,博客等等。
一個搜索服務(wù)架構(gòu)分為兩大部分:索引+搜索。
1.1 索引
索引的過程又分為數(shù)據(jù)采集,清洗,進(jìn)入lucene等等,這里我們不關(guān)注數(shù)據(jù)源的問題,只關(guān)注索引在進(jìn)入lucene會有哪些操作。
1.1.1. 數(shù)據(jù)處理
在往lucene進(jìn)行數(shù)據(jù)存儲的時候首先會進(jìn)行分詞,比如"我的家鄉(xiāng)是河南","this ARE GOOD books " 在下面顯示了對應(yīng)的分詞結(jié)果
GET user/_analyze {"analyzer": "ik_smart","text": ["我的家鄉(xiāng)是河南"] }對應(yīng)的分詞結(jié)果是 {"tokens" : [{"token" : "我","start_offset" : 0,"end_offset" : 1,"type" : "CN_CHAR","position" : 0},{"token" : "的","start_offset" : 1,"end_offset" : 2,"type" : "CN_CHAR","position" : 1},{"token" : "家鄉(xiāng)","start_offset" : 2,"end_offset" : 4,"type" : "CN_WORD","position" : 2},{"token" : "是","start_offset" : 4,"end_offset" : 5,"type" : "CN_CHAR","position" : 3},{"token" : "河南","start_offset" : 5,"end_offset" : 7,"type" : "CN_WORD","position" : 4}] }再來一個英文的
GET user/_analyze {"analyzer": "ik_smart","text": ["this ARE GOOD books "] }{"tokens" : [{"token" : "good","start_offset" : 9,"end_offset" : 13,"type" : "ENGLISH","position" : 0},{"token" : "books","start_offset" : 14,"end_offset" : 19,"type" : "ENGLISH","position" : 1}] }對應(yīng)的可以看到,一個句子被分成了多個詞,同時可能會有一些轉(zhuǎn)化,比如大寫變小寫,復(fù)數(shù)變單數(shù)等。
其實(shí)analyzer又有三個部分組成
詞干抽取被稱為stemming,方式也分為兩種,基于算法的詞干抽取和基于字典的詞干抽取。
基于算法有可能會導(dǎo)致不準(zhǔn)確的結(jié)果,但是只要index 和 query的過程都使用同樣的算法,那么就可以保證搜索效果的一致性。
基于字典的詞干抽取的效果則取決于字典的質(zhì)量,而且大量的字典可能會占據(jù)比較大的內(nèi)存。
1.1.2. 數(shù)據(jù)存儲
在一個文檔進(jìn)行了分詞,詞干提取等處理之后,會交給indexer,由indexer來進(jìn)行存儲。
存儲一般包括兩個部分,索引的正向信息,和反向信息,
正向信息是指從index–>segment—>doc-field—>field-terms 的信息,這里存儲的基本上是文檔的正向信息,也是完整信息。
反向信息就是我們常說的倒排索引了 terms—>doc-list 通過對terms的命中可以快速的找到對應(yīng)的doc信息。
1.2 查詢search
query樣例 用戶輸入語句:lucene AND learned NOT hadoop。
1.2.1. 語法分析
查詢語句又會有一些語法,類似sql一樣,必有有or,and,not等語法,所以先要進(jìn)行這些語法分析,識別這些關(guān)鍵字
提取了兩個關(guān)鍵字 AND NOT
1.2.2. 詞分析
和index的時候?qū)Υ说牟僮魇且恢碌?br /> 上面會產(chǎn)生三個term lucene learned hadoop
1.2.3 搜索搜因得到文檔
1.2.4 進(jìn)行相關(guān)性分析,根據(jù)相關(guān)性打分進(jìn)行排序,并返回結(jié)果
相關(guān)性得分計算有一些公開的比較成熟的方案,比如之前的tf/idf,現(xiàn)在的BM25打分公式等。
上面就是搜索是兩大模塊式 index,search的主體流程,后面我們逐漸深入lucene的數(shù)據(jù)結(jié)構(gòu)。
·
總結(jié)
- 上一篇: lucene7.5的数据结构
- 下一篇: kafka学习梳理