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