引自:
http://www.gamvan.com/developer/java/opener/2005/12/846.html對于lucene全文檢索,可以簡約地看看它的7個主要類,這7個類同時也表達了處理全文檢索的7個意念。因為數據庫比較為人所熟悉,它又與全文檢索某些理念極為相似,所以在對下面的概念說明時,將會大量在滲入數據庫和全文檢索間的類比。
1)Document :它的中文意思是文檔,對于一個文檔,通常都包括它的標題、時間、作者、內容。如果讓它的意思泛化,它也有文件的意思(相信Lucene的作者在取這個類名的時候也是經過再三斟酌的),對于文件,它可以指一個TXT文本、一個HTML網頁、一個PDF文件等等。總而言之,它是映射著某一個具體的文件,這就是它的單位粒度。對應于
數據庫的概念是記錄,英文是Record,weblucene在索引源的xml中就原原本本地采用了這個概念,可參照<weblucene_home>/dump/blog.xml 。
2)Field :中文意思是字段。漢語的翻譯將這個單詞的意思表達得更恰如其分了,意思是文字片段,它可以是一個或多個字。字段是文檔(Document)的次粒度單位,也是檢索的最基本單位。注意這個概念跟在搜索引擎的輸入框中隨意輸入的那幾個字或幾組字不是一樣的,在搜索輸入框中輸入的那些文字首先需要經過一個QueryParser(這也是7個類中的一個)將其分解成真正的Field。 在
數據庫中本來就有Field 這個概念,它即是Record的次級單位。在
數據庫一條或多條記錄怎么被找出來的,往往就經由對Field的檢索而得來。在全文檢索中Document的最終取得也是差不多,它是根據現在的某個Filed來決定的。即根據文檔中的某些還不完整的東西牽引出它的所需的全部。
示例代碼:
代碼內容 [com.chedong.weblucene.search.WebLuceneResultSetTest] Document doc = new Document(); doc.add(Field.Keyword("keyword", "房地產")); doc.add(Field.Keyword("keyword", "非典")); |
3)IndexWriter :索引書寫者
示例代碼:
[org.apache.lucene.index.TestIndexWriter]
代碼內容 Document doc = new Document(); doc.add(Field.UnStored("content", "aaa")); try { IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true); writer.addDocument(doc); } catch (IOException e) { e.printStackTrace(); } |
它的構造器new IndexWriter(dir, new WhitespaceAnalyzer(), true) 有三個參數,分別是Directory對象、分析器對象(這是下一個要介紹的類)和一個布爾量,是否要重寫索引就是由這個布爾量標明的,如果取false則僅僅是將索引附加上來。
4)Analyzer : 分析器,它將目錄中的一組原始文件分析成由一組Document和它相應的次級粒度Field組成的索引。因為不同的文件類型,同樣的文本其內部文件流組織形式是不一樣的,所以需要不同的分析器處理不同的文件類型(如PDFAnalyzer、HtmlAnalyzer)。又因為不同的文字語言處理Field拆分(Token)上是不一樣的,所以在語言角度上又有另一層分析器的類別區分,如下面這行代碼是處理普通中文字符的
[com.chedong.weblucene.search.WebLuceneResultSetTest]
IndexWriter writer = new IndexWriter(dir, new CJKAnalyzer(), true);
5)QueryParser :這前面在區分Field和用戶輸入的搜索關鍵字時已經提及了。(它所用的詞是Query,跟
數據庫所用的是一個概念的,這個詞同樣的檢索上讓人感覺沒有像Search那么費盡心思去深究。)QueryParser并沒有實際地去做查詢工作,它只是Parser(剖析)用戶輸入的東西,并把剖析的結果以一種規則的形式送給Searcher去執行一個真正的搜索。作為剖析的結果,不僅僅是Field,還有Field們相互間的關系(terms,譬如邏輯和AND,邏輯或OR, 邏輯非NOT)。
6)Searcher : 搜索一個Query,將結果返回。
[org.apache.lucene.search..TestNot]
代碼內容 RAMDirectory store = new RAMDirectory(); IndexWriter writer = new IndexWriter(store, new SimpleAnalyzer(), true);
Document d1 = new Document(); d1.add(Field.Text("field", "a b"));
writer.addDocument(d1); writer.optimize(); writer.close();
Searcher searcher = new IndexSearcher(store); Query query = QueryParser.parse("a NOT b", "field", new SimpleAnalyzer()); //System.out.println(query); Hits hits = searcher.search(query); |
對于每一個搜索器對象,它都需要指定一個索引文件路徑,然后由搜索器對Query對象執行查詢。 上面的這個類袖珍地對7個主要類都均有涉及。
7)Hits : Lucene的類注釋是:A ranked list of documents, used to hold search results. 搜索的結果不僅僅是一些文檔,而且這些文檔還是有級別的,這個級別是對于先后次序而言的。它對應于
數據庫中的RecordSet / ResultSet 。