在介紹lucene之前,需要理解一些概念(此段摘自
document
使用者提供的源是一條條記錄,它們可以是文字檔案、字串或者資料庫表的一條記錄等等。一條記錄經過索引之後,就是以乙個document的形式儲存在索引檔案中的。使用者進行搜尋,也是以document列表的形式返回。
field
乙個document可以包含多個資訊域,例如一篇文章可以包含「標題」、「正文」、「最後修改時間」等資訊域,這些資訊域就是通過field在document中儲存的。
field有兩個屬性可選:儲存和索引。通過儲存屬性你可以控制是否對這個field進行儲存;通過索引屬性你可以控制是否對該field進行索引。這看起來似乎有些廢話,事實上對這兩個屬性的正確組合很重要,下面舉例說明:還是以剛才的文章為例子,我們需要對標題和正文進行全文搜尋,所以我們要把索引屬性設定為真,同時我們希望能直接從搜尋結果中提取文章標題,所以我們把標題域的儲存屬性設定為真,但是由於正文域太大了,我們為了縮小索引檔案大小,將正文域的儲存屬性設定為假,當需要時再直接讀取檔案;我們只是希望能從搜尋解果中提取最後修改時間,不需要對它進行搜尋,所以我們把最後修改時間域的儲存屬性設定為真,索引屬性設定為假。上面的三個域涵蓋了兩個屬性的三種組合,還有一種全為假的沒有用到,事實上field不允許你那麼設定,因為既不儲存又不索引的域是沒有意義的。
term
term是搜尋的最小單位,它表示文件的乙個詞語,term由兩部分組成:它表示的詞語和這個詞語所出現的field。
tocken
tocken是term的一次出現,它包含trem文字和相應的起止偏移,以及乙個型別字串。一句話中可以出現多次相同的詞語,它們都用同乙個term表示,但是用不同的tocken,每個tocken標記該詞語出現的地方。
segment
新增索引時並不是每個document都馬上新增到同乙個索引檔案,它們首先被寫入到不同的小檔案,然後再合併成乙個大索引檔案,這裡每個小檔案都是乙個segment。
parsing(解析):
lucene作為建立索引及對索引進行搜尋的庫,其只接受
純文字輸入,而對於我們的應用程式往往要處理多種不同型別的檔案,如html, xml, pdf, word等等。因此,在應用lucene之前,應用程式要負責將非純文字形式的檔案進行預處理,轉化為純文字檔案,然後在交與lucene進行處理。
tokenization:
lucene將輸入的純文字檔案內容進行 斷詞 處理,得到一些小的用來索引的元素,成為token,而這整個過程稱為tokenization。
在一些情況下,僅僅對文字內容進行分詞處理還不夠,還需要一些相應的前期處理及後期處理。
前期處理包括(但不僅限於):
後期處理包括(但不僅限於):
analyzer 和 tokenizer 常常令人令人迷惑,下面羅列一些他們之間的區別:
關於tokenstream和field等概念後續文章會有講解。
lucene提供了許多用來執行analyze功能的類,他們均是analyzer的子類,最常用的則是standardanalyzer類。儘管standardanalyzer類足以滿足許多成熟的應用需求,然而還是有一些很有用的類或者包值得我們在此處提一下:
在lucene根資料夾下analysis庫包含了許多不同的analyzer實現,用來解決與搜尋相關的不同問題。許多analyzer都是被設計用來處理非英語語言的。
在這個包中,有許多tokenizer 和 tokenfilter的實現,瀏覽過後或許你會找到自己所需要的那個。
analysis是在索引過程中影響效能的主要因素,簡而言之,在多數情況下,分析量越大,索引速度越慢。benchmark庫可以被用來測試analysis過程的速度。
呼叫analyzer:
應用程式一般不需要主動呼叫analyzer--lucene提我們做這些工作:
然而為了測試或其他目的,應用程式也可以直接為一些文件呼叫analyzer,就像下面所示的那樣:
version matchversion = version.lucene_xy; // substitute desired lucene version for xy
analyzer analyzer = new standardanalyzer(matchversion); // or any other analyzer
tokenstream ts = analyzer.tokenstream("myfield", new stringreader("some text goes here"));
offsetattribute offsetatt = ts.addattribute(offsetattribute.class);
try
ts.end(); // perform end-of-stream operations, e.g. set the final offset.
} finally
關於編寫自己的analyzer,具體的請見官方文件,此處不再贅述
學習心得(一)
1.利用好手頭上的資源而不要一味地屯資源,資源只有被利用才是有價值的 2.關於筆記 筆記只是幫助我們學習和精進的一種工具,它只是一種方法,一種手段,但是絕不是我們的目的,沒有必要強迫自己在做筆記時,把每乙個字都寫的端正和美觀,把筆記做得完美,不僅消耗我們的時間,而且很可能它浪費了我們原本可以用來做題...
學習心得 python學習心得
自從來了深圳工作以後,尤其是屢屢面試碰壁以後。發現其實自己的知識面很窄,做筆試題的時候絞盡腦汁還是漏洞百出,並不是不會做,而是出現一大堆不該有的失誤。每次被問道,對資料庫了解嗎?說一大堆看起來很高階的東西 好啊,那我們寫幾個sql語句吧。馬上完蛋了,沒了手冊關鍵字都記不起。了解哪幾種指令碼語言,sh...
學習心得 我的學習心得
我是乙個已經步入中年的70後,離開校園已經20年了,因為當年的政策因素而未能圓我的大學夢,在20年的工作過程中總是因為缺少一張大學文憑而失去了很多機會,曾經也考慮過自考,但是乙個人去面對的時候總感覺心有餘而力不足。2018年3月份偶然讓我認識了尚德,原來自考還可以這樣學習。一直懷疑自己年紀大了記憶力...