天天看點

lucene3.x核心類介紹

:) [b]索引核心類[/b] :o

[b]Directory[/b]:描述Lucene索引存放的位置,是一個抽象類,由子類負責指定索引存在位置:記憶體或者磁盤;

[b]IndexWrite[/b]r:負責建立或者打開新索引,以及對索引做增删改操作;

[b]Analyzer[/b]:文本檔案在被索引前需要經過它進行分析,把它的對象在IndexWriter構造時傳入,是抽象類;Analyzer 是分析器,它的作用是把一個字元串按某種規則劃分成一個個詞語,并去除其中的無效詞語,這裡說的無效詞語是指英文中的“of”、 “the”,中文中的 “的”、“地”等詞語,這些詞語在文章中大量出現,但是本身不包含什麼關鍵資訊,去掉有利于縮小索引檔案、提高效率、提高命中率。

分詞的規則千變萬化,但目的隻有一個:按語義劃分。這點在英文中比較容易實作,因為英文本身就是以單詞為機關的,已經用空格分開;而中文則必須以某種方法将連成一片的句子劃分成一個個詞語。具體劃分方法下面再詳細介紹,這裡隻需了解分析器的概念即可。

[b]Document[/b]:文檔對象代表一些域的集合;使用者提供的源是一條條記錄,它們可以是文本檔案、字元串或者資料庫表的一條記錄等等。一條記錄經過索引之後,就是以一個Document的形式存儲在索引檔案中的。使用者進行搜尋,也是以Document清單的形式傳回。

[b]Field[/b]:每個域都有域名和對應的域值;一個Document可以包含多個資訊域,例如一篇文章可以包含“标題”、“正文”、“最後修改時間”等資訊域,這些資訊域就是通過Field在Document中存儲的。

Field有兩個屬性可選:存儲和索引。通過存儲屬性你可以控制是否對這個Field進行存儲;通過索引屬性你可以控制是否對該Field進行索引。這看起來似乎有些廢話,事實上對這兩個屬性的正确組合很重要,下面舉例說明:

還是以剛才的文章為例子,我們需要對标題和正文進行全文搜尋,是以我們要把索引屬性設定為真,同時我們希望能直接從搜尋結果中提取文章标題,是以我們把标題域的存儲屬性設定為真,但是由于正文域太大了,我們為了縮小索引檔案大小,将正文域的存儲屬性設定為假,當需要時再直接讀取檔案;我們隻是希望能從搜尋解果中提取最後修改時間,不需要對它進行搜尋,是以我們把最後修改時間域的存儲屬性設定為真,索引屬性設定為假。上面的三個域涵蓋了兩個屬性的三種組合,還有一種全為假的沒有用到,事實上Field不允許你那麼設定,因為既不存儲又不索引的域是沒有意義的。

[b]tocken: [/b]tocken是term的一次出現,它包含trem文本和相應的起止偏移,以及一個類型字元串。一句話中可以出現多次相同的詞語,它們都用同一個term表示,但是用不同的tocken,每個tocken标記該詞語出現的地方。

[b]segment: [/b]添加索引時并不是每個document都馬上添加到同一個索引檔案,它們首先被寫入到不同的小檔案,然後再合并成一個大索引檔案,這裡每個小檔案都是一個segment。

:roll: [b]搜尋核心類[/b] :oops:

[b]IndexSearcher[/b]:以隻讀的方式打開索引,需要Directory(指出索引位置)構造出來;

[b]Term[/b]:搜尋時候基本單元,由域名和域值組成,類似于field;term是搜尋的最小機關,它表示文檔的一個詞語,term由兩部分組成:它表示的詞語和這個詞語所出現的field。

[b]Query[/b]:查詢抽象類,有許多具體的子類實作,如TermQuery;

[b]TermQuery[/b]:比對指定域中包含特定項的文檔;

[b]TopDocs[/b]:一個簡單的指針日期,指向前N個排名的搜尋結果。

繼續閱讀