Lucene全文搜尋工具分析

2021-06-16 09:56:17 字數 3173 閱讀 9720

專案中都會有搜尋的功能,有些搜尋非常簡單,就是按照姓名查詢或者按著性別查詢。這樣的查詢我們會用到模糊查詢,也就是like。如果是兩個也就是用like 和or關鍵字。

like關鍵字是非常影響效率的,這點我們可以從乙個生活中的例子來看就能夠知道。我們使用like關鍵字就好像是我們在查一本沒有目錄的字典,我們要在從字典的第一頁開始,乙個乙個的找,知道找出所有符合條件的結果。所以說like關鍵字是非常影響效率的。

那麼我們在生活中比較正規的方法查字典的方法是,我們會通過目錄(這個目錄可能是拼音或者偏旁)查詢,進而一部定位結果。

所以,lucene給我們提供了這樣一種比較符合於我們生活中的方式來查閱資訊的一種實現。也就是說lucene的出現就是方便我們快速檢索資訊。他主要完成的工作就是首先對我們的整個內容建立乙個索引(這個索引就相當於我們生活中的那個字典的目錄),之後我們通過目錄可以直接定位並且查出我們所需要的結果。這就是lucene出現的意義所在。

lucene架構:

他的架構圖還是比較簡單的,我們從圖中就能看出,lucene的架構就是兩方面內容:

收集資料--->建立索引--->儲存索引

使用者查詢--->搜尋索引---->從資料庫中查詢---->呈現搜尋結果---->使用者

lucene中有這樣一些核心類,通過他們我們可以完成lucene架構圖中展示的建立索引和搜尋功能:

另外在我們建立索引的時候會涉及到乙個是否要建立索引的問題和乙個是否要儲存的問題,一下的紅色字型部分為這兩個知識點的解釋:

index.analyzed:

進行分詞和索引,適用於標題、內容等

index.not_analyzed:

進行索引,但是不進行分詞,如果身份證號,姓名,id等,適用於精確搜尋

index.analyzed_not_norms:

進行分詞但是不儲存norms資訊,這個norms中包括了建立索引的時間和權值等資訊

index.not_analyzed_not_norms:

即不進行分詞也不儲存norms資訊

index.no:

不進行索引 

yes:

將會儲存域值,原始字串的值會儲存在索引,以此可以進行相應的恢復操作,對於主鍵,標題可以是這種方式儲存

nonot_analyzed_not_norms

yes識別符號(主鍵、檔名),**號碼,身份證號,姓名,日期

anaylzed

yes文件標題和摘要

anaylzed

no文件正文

noyes

文件型別,資料庫主鍵(不進行索引)

not_analyzed

no隱藏關鍵字

另外,強大的lucene全文搜尋工具中還有乙個非常重要的概念就是分詞,這個概念可以說是搜尋中非常關鍵的部分。分詞器做好處理之後得到的乙個流,這個流中儲存了分詞的各種資訊,可以通過tokenstream有效的獲取到分詞單元資訊。這個過程如圖所示:

lucene中帶有的分詞器有******analyzer、stopanalyzer、whitespaceanalyzer、standardanalyzer(這個就部分別給大家做事例說明他們的區別了,大家可以自己研究一下)。另外lucene支援我們自定義分詞器。而且lucene中自帶分詞器一般是支援英文的,那麼我們中文分詞器比較常見的有兩種,乙個是庖丁解牛分詞器【沒有更新了】,乙個是mmseg4j【使用的是搜狗詞庫】分詞器。

tika是apache的乙個專案,主要是用於開啟各種不同的文件,以便lucene做索引;solr是乙個全文搜尋的伺服器,可以與tomcat整合。還有就是luke,這個工具主要是檢視lucene建立的索引的。

最後做乙個簡單的建立索引和簡單查詢的例項:

用乙個簡單的例項來建立索引:

1、建立directory

2、建立indexwriter

3、迴圈遍歷檔案,建立document

4、新增document(文件相當於表中的每一條記錄,域相當於表中每乙個字段)

5、關閉indexwriter

publicvoid index()

} catch (corruptindexexception e) catch (lockobtainfailedexception e) catch (ioexception e) finally catch (corruptindexexception e) catch (ioexception e) }}

}

建立索引為:

這些索引如何來看呢?

用lukeall-3.5.0.jar 這個工具(注意要和lucene版本一致)

搜尋的簡單實現:

1、建立indexreader

2、建立indexsearcher

3、建立term和termquery

4、根據termquery獲取topdocs

5、根據topdocs獲取scoredoc

6、根據scoredoc獲取相應文件

publicvoid searcher()

reader.close();

} catch (ioexception e) catch (parseexception e)

}

備註:lucene工具支援很多查詢:萬用字元、數字、日期、範圍、模糊等:

Lucene全文搜尋學習筆記(二)

luceneutil的編寫,主要是對document2bean以及bean2document操作的封裝。寫的不完善,先學完lucene再說。public class luceneutil catch exception e param obj 傳入的物件,用到反射將field存入索引庫 return...

全文搜尋Lucene 之倒排演算法

size large 背景 size 關聯式資料庫不適合做全文搜尋 list like 效率很慢,建的索引將無效,查詢的時候會像翻書一樣一頁一頁的翻 當搜尋live的時候,也想把lives living搜出來,但是資料庫很難做到 list size large 倒排演算法 size lucene在國...

lucene 搜尋工具類

搜尋 1.建立搜尋的索引目錄 directory directory fsdirectory.open new file e lucene demo 2.建立搜尋器 indexsearcher searcher indexreader.open directory 3.建立搜尋條件 query qu...