下邊介紹一下lucene的核心類:(參考lucene in action)
主要有兩部分組成,核心索引類和核心搜索類,顧名思意,就是用來建立索引和用來搜索的類。
IndexWriter:可以對索引進行寫操作,但不能讀取或者搜索。是唯一能寫索引的類。
Directory:Directory類代表一個Lucene索引的位置。它是一個抽象類,允許它的子類(其中的兩個包含在Lucene中)在合適時存儲索引。在我們的Indexer示例中,我們使用一個實際文件系統目錄的路徑傳遞給IndexWriter的構造函數來獲得Directory的一個實例。IndexWriter然后使用Directory的一個具體實現FSDirectory,并在文件系統的一個目錄中創建索引。在你的應用程序中,你可能較喜歡將Lucene索引存儲在磁盤上。這時可以使用FSDirectory,一個包含文件系統真實文件列表的Driectory子類,如同我們在Indexer中一樣。另一個Directory的具體子類是RAMDirectory。盡管它提供了與FSDirectory相同的接口,RAMDirectory將它的所有數據加載到內存中。所以這個實現對較小索引很有用處,可以全部加載到內存中并在程序關閉時銷毀。因為所有數據加載到快速存取的內存中而不是在慢速的硬盤上,RAMDirectory適合于你需要快速訪問索引的情況,不管是索引或搜索。做為實例,Lucene的開發者在所有他們的單元測試中做了擴展使用:當測試運行時,快速的內存駐留索引被創建搜索,當測試結束時,索引自動銷毀,不會在磁盤上留下任何殘余。當然,在將文件緩存到內存的操作系統中使用時RAMDirectory和FSDirectory之間的性能差別較小
Analyzer:分析文本內容,提取關鍵字
Document:一個Document代表字段的集合。你可以把它想象為以后可獲取的虛擬文檔—一塊數據,如一個網頁、一個郵件消息或一個文本文件。一個文檔的字段代表這個文檔或與這個文檔相關的元數據
Field:在索引中的每個Document含有一個或多個字段,具體化為Field類。每個字段相應于數據的一個片段,將在搜索時查詢或從索引中重新獲取。
Lucene提供四個不同的字段類型,你可以從中做出選擇:
Keyword—不被分析,但是被索引并逐字存儲到索引中。這個類型適合于原始值需要保持原樣的字段,如URL、文件系統路徑、日期、個人名稱、社會安全號碼、電話號碼等等。例如,我們在Indexer(列表1.1)中把文件系統路徑作為Keyword字段。
UnIndexed—不被分析也不被索引,但是它的值存儲到索引中。這個類型適合于你需要和搜索結果一起顯示的字段(如URL或數據庫主鍵),但是你從不直接搜索它的值。因為這種類型字段的原始值存儲在索引中,這種類型不適合于存放比較巨大的值,如果索引大小是個問題的話。
UnStored—和UnIndexed相反。這個字段類型被分析并索引但是不存儲在索引中。它適合于索引大量的文本而不需要以原始形式重新獲得它。例如網頁的主體或任休其它類型的文本文檔。
Text—被分析并索引。這就意味著這種類型的字段可以被搜索,但是要小心字段大小。如果要索引的數據是一個String,它也被存儲;但如果數據(如我們的Indexer例子)是來自一個Reader,它就不會被存儲。這通常是混亂的來源,所以在使用Field.Text時要注意這個區別。
所有字段由名稱和值組成。你要使用哪種字段類型取決于你要如何使用這個字段和它的值。嚴格來說,Lucene只有一個字段類型:以各自特征來區分的字段。有些是被分析的,有些不是;有些是被索引,然面有些被逐字地存儲等等。
注意 注意Field.Text(String, String)和Field.Text(String, Reader)之間的區別。String變量存儲字段數據,而Reader變量不存儲。為索引一個String而又不想存儲它,可以用Field.UnStored(String, String)
下邊是核心搜索類:
IndexSearcher:IndexSearcher用來搜索而IndexWriter用來索引:暴露幾個搜索方法的索引的主要鏈接。你可以把IndexSearcher想象為以只讀方式打開索引的一個類。它提供幾個搜索方法,其中一些在抽象基類Searcher中實現;最簡單的接受單個Query對象做為參數并返回一個Hits對象。這個方法的典型應用類似這樣:
IndexSearcher is = new IndexSearcher(
FSDirectory.getDirectory(“/tmp/index”, false));
Query q = new TermQuery(new Term(“contents”, “lucene”));
Hits hits = is.search(q);
Term:
Term是搜索的基本單元。與Field對象類似,它由一對字符串元素組成:字段的名稱和字段的值。注意Term對象也和索引過程有關。但是它們是由Lucene內部生成,所以在索引時你
一般不必考慮它們。在搜索時,你可能創建Term對象并TermQuery同時使用。
Query q = new TermQuery(new Term(“contents”, “lucene”));
Hits hits = is.search(q);
這段代碼使Lucene找出在contents字段中含有單詞lucene的所有文檔。因為TermQuery對象繼承自它的抽象父類Query,你可以在等式的左邊用Query類型。
Query
Lucene中包含一些Query的具體子類。到目前為止,在本章中我們僅提到過最基本的Lucene Query:TermQuery。其它Query類型有BooleanQuery,PhraseQuery, PrefixQuery, PhrasePrefixQuery, RangeQuery, FilteredQuery和SpanQuery
TermQuery
TermQuery是Lucene支持的最基本的查詢類型,并且它也是最原始的查詢類型之一。它用來匹配含有指定值的字段的文檔.
Hits類是一個搜索結果(匹配給定查詢的文檔)文檔隊列指針的簡單容器。基于性能考慮,Hits的實例并不從索引中加載所有匹配查詢的所有文檔,而是每次一小部分