搜尋的一般過程

2021-10-20 09:26:39 字數 1915 閱讀 2154

之前學習過很多劉老師的lucene原始碼分析的課程,結果現在整的都忘了,這次重新梳理一下爭取形成自己的東西。

後面就不容易忘掉了。

劉老師的課程是基於lucene2.x的原始碼分析的,後面lucene迭代了很多版本,也引入了新的資料結構進行優化,但是主體的模組基本上是沒有變的。計畫是先把之前的lunce的資料結構整理一下,因為可以查閱劉老師的課程,可以有很好的參考作用。在這個基礎上再整理和對比新的lucene的優化點,基於lucene7.x在這裡主要關注lucene的儲存結構,因為了解了儲存結構基本上就了解了大體的實現。

搜尋主要是解決使用者基於文字進行搜尋的問題。比如在很多本書中搜尋一些內容,或者搜尋一些帖子,部落格等等。

乙個搜尋服務架構分為兩大部分:索引+搜尋。

索引的過程又分為資料採集,清洗,進入lucene等等,這裡我們不關注資料來源的問題,只關注索引在進入lucene會有哪些操作。

1.1.1. 資料處理

在往lucene進行資料儲存的時候首先會進行分詞,比如"我的家鄉是河南","this are good books " 在下面顯示了對應的分詞結果

get user/_analyze

對應的分詞結果是

, ,,,

]}

再來乙個英文的

get user/_analyze

,

]}

對應的可以看到,乙個句子被分成了多個詞,同時可能會有一些轉化,比如大寫變小寫,複數變單數等。

其實analyzer又有三個部分組成

character_filter 對輸入文件的源資料進行處理,比如將拉丁文轉為數字等,也可以是刪掉一些字元

tokenizer 對character_filter 過濾後的文件進行分詞,會記錄詞的位置資訊以及字元偏移量

token_filter 對分出來的詞進行處理,比如大寫轉小寫,詞幹抽取等。

詞幹抽取被稱為stemming,方式也分為兩種,基於演算法的詞幹抽取和基於字典的詞幹抽取。

基於演算法有可能會導致不準確的結果,但是只要index 和 query的過程都使用同樣的演算法,那麼就可以保證搜尋效果的一致性。

基於字典的詞幹抽取的效果則取決於字典的質量,而且大量的字典可能會佔據比較大的記憶體。

1.1.2. 資料儲存

在乙個文件進行了分詞,詞幹提取等處理之後,會交給indexer,由indexer來進行儲存。

儲存一般包括兩個部分,索引的正向資訊,和反向資訊,

正向資訊是指從index–>segment—>doc-field—>field-terms 的資訊,這裡儲存的基本上是文件的正向資訊,也是完整資訊。

反向資訊就是我們常說的倒排索引了 terms—>doc-list 通過對terms的命中可以快速的找到對應的doc資訊。

query樣例 使用者輸入語句:lucene and learned not hadoop。

1.2.1. 語法分析

查詢語句又會有一些語法,類似sql一樣,必有有or,and,not等語法,所以先要進行這些語法分析,識別這些關鍵字

提取了兩個關鍵字 and not

1.2.2. 詞分析

和index的時候對此的操作是一致的

上面會產生三個term lucene learned hadoop

1.2.3 搜尋搜因得到文件

根據前面兩步得到了查詢的邏輯以及對應的term

從倒排鍊錶中找到對應的文件集合,得到3個文件集合

對lucene和learned對應的兩個文件集合求交集,然後和hadoop的文件集合求差集。

1.2.4 進行相關性分析,根據相關性打分進行排序,並返回結果

相關性得分計算有一些公開的比較成熟的方案,比如之前的tf/idf,現在的bm25打分公式等。

上面就是搜尋是兩大模組式 index,search的主體流程,後面我們逐漸深入lucene的資料結構。

感冒的一般過程

又感冒了 哎 挺嚴重,鼻涕流不停,特別畏寒,以前沒 發現感冒 這麼可怕。看到 一篇關於感冒的 文章,粘過來 給大家分享 一下,以防感冒 感冒,是一種自癒性疾病。有位著名醫生說過 感冒,不 七天就會好,如果 的話,一周即可痊癒。感冒是自癒性疾病,病程7天。這個病程是指的感冒病毒活動期。一般感覺到的感冒...

一般問題求解過程

當遇到問題時,就要思考如何來解決這些問題,以下就是解決問題的一般過程 分析問題 從多方位 多角度分析問題,例如,根本原因 直接原因。設計方案 每乙個方案的利弊都應該不一樣,多設計幾個方案也是以備不時之需。方案選擇 從中挑選出最合理的方案,備選方案可以在執行方案之時有機結合。解決步驟 方案確定好了之後...

Linux移植的一般過程

前一陣子在公司移植linux2.6到一塊arm11的開發板上,下面粗略講講移植linux的一般過程。一開始的uboot的移植不多說了。uboot最後有兩種方式進入linux,一種是使用uimage,可以在引導時附加命令列引數,但操作起來比較麻煩。另一種較簡單的是使用tftp將linux核心載入到0x...