solr是一個全局檢索引擎,能夠快速地從大量的文本數據中選出你所需要的數據,而你只需要提供相應的關鍵詞進行檢索。solr的高效率查詢靠的是底層強大的索引庫,所以solr最關鍵的技術也是其底層的索引設計。solr工作的時候可以歸結成兩個過程1.創建索引2.搜索索引。
這是一張solr的基本工作圖:
如圖所示:
1.圖中橫線左邊部分說明了solr中的數據來源,solr可以從數據庫中獲得數據,用戶只需要簡單的操作即可將數據庫中的數據導入到solr中,除了數據庫外solr可以從文件系統中保存數據,能直接保存互聯網的數據,當熱用戶也可手動導入數據。
2.圖中的index Documents就是前文所說的兩個過程中的第一個創建索引,solr必須對導入的數據創建索引來保證查詢的效率。
3.圖上最底下有個index,表示一個索引庫,索引庫可以近似的看成是一個數據庫,前面創建的索引必須保存在索引庫中。
4.圖中的橫線上邊右半部分表示了用戶對solr的查詢,用戶通過各種方式對solr進行查詢(如手動在solr管理頁面上,通過solrj進行查詢),查詢到達solr后,solr進行search index(去索引庫中對剛剛創建的索引進行檢索)來找到用戶想要得到的數據,並將數據集返回給用戶。
solr索引
solr的索引類似如下圖:
solr的索引是一個反向索引,比如說現在要找帶solr這個詞的數據,那么首先會在詞典中找到solr這個詞,在倒排表中會有一個鏈表與solr這個詞關聯着,這個鏈表就是帶有solr這個詞的文本集的序號集。
索引的創建過程
索引的創建過程可以分為:1.分詞組件2.語言處理組件3.索引組件
1.分詞組件:
當數據存入solr的時候首先會通過分詞組件,分詞組件的作用1.將數據分成一個個詞匯。2.去除標點符號.3.去除停詞(比如中文的“的”,“和”,“啦”等等)
比如存入“Students should be allowed to go out!”分詞組件會先將句子分成多個單詞“Students”,“should”,“be” ,“allowed”,“to”,“go”,“out”,“!”。隨后會進行第二部將標點符號“!”去掉,最后第三步會將“to”,“be”去掉。最后留下的結果為:“Students”,“should”,“allowed”,“go”,“out”。
注意:可以看出我們再對solr進行搜索的時候應該盡量避免使用符號或者停頓詞作為檢索關鍵詞。
2.語言處理組件:
語言處理組件的作用如下:
1.變為小寫(Lowercase)。
2.將單詞縮減為詞根形式,如”cars”到”car”等。這種操作稱為:stemming。
3.將單詞轉變為詞根形式,如”drove”到”drive”等。這種操作稱為:lemmatization。
注意:至此索引創建完成,搜索”drive”時,”driving”,”drove”,”driven”也能夠被搜到。因為在索引中,”driving”,”drove”,”driven”都會經過語言處理而變成”drive”,在搜索時,如果您輸入”driving”,輸入的查詢語句同樣經過分詞組件和語言處理組件處理的步驟,變為查詢”drive”,從而可以搜索到想要的文檔。Lowercase,stemming同理
3.索引組件
假設現在有兩個文檔:
文檔一:Students should be allowed to go out with their friends, but not allowed to drink beer.
文檔二:My friend Jerry went to school to see his students but found them drunk which is not allowed.
經過前兩個組件的處理后得到如下索引:
Term Document ID
student 1
allow 1
go 1
their 1
friend 1
allow 1
drink 1
beer 1
my 2
friend 2
jerry 2
go 2
school 2
see 2
his 2
student 2
find 2
them 2
drink 2
allow 2
對字典按字母順序排序:
Term Document ID
allow 1
allow 1
allow 2
beer 1
drink 1
drink 2
find 2
friend 1
friend 2
go 1
go 2
his 2
jerry 2
my 2
school 2
see 2
student 1
student 2
their 1
them 2
合並相同的詞(Term)成為文檔倒排(Posting List)鏈表
Document Frequency:文檔頻次,表示多少文檔出現過此詞(Term)
Frequency:詞頻,表示某個文檔中該詞(Term)出現過幾次
索引的檢索
通過前幾步索引的創建,現在就可以對創建的索引進行檢索了。
1.當用戶的檢索關鍵詞進入solr后,solr會對傳入的關鍵詞進行處理,具體處理過程類似創建索引時語言處理組件對文檔詞匯的處理過程。
2.將處理后的詞在詞典中搜索得到一個文檔集。
3.將文檔集根據詞頻將文檔集進行相關性排序。
4.將結果集返回給用戶