天天看點

lucene核心類詳解

建立索引

為了對文檔進行索引,Lucene 提供了五個基礎的類,他們分别是 Document, Field, IndexWriter, Analyzer, Directory。下面我們分别介紹一下這五個類的用途:

Document

Document 是用來描述文檔的,這裡的文檔可以指一個 HTML 頁面,一封電子郵件,或者是一個文本檔案。一個 Document 對象由多個 Field 對象組成的。可以把一個 Document 對象想象成資料庫中的一個記錄,而每個 Field 對象就是記錄的一個字段。

Field

Field 對象是用來描述一個文檔的某個屬性的,比如一封電子郵件的标題和内容可以用兩個 Field 對象分别描述。

Analyzer

在一個文檔被索引之前,首先需要對文檔内容進行分詞處理,這部分工作就是由 Analyzer 來做的。Analyzer 類是一個抽象類,它有多個實作。針對不同的語言和應用需要選擇适合的 Analyzer。Analyzer 把分詞後的内容交給 IndexWriter 來建立索引。

IndexWriter

IndexWriter 是 Lucene 用來建立索引的一個核心的類,他的作用是把一個個的 Document 對象加到索引中來。

Directory

這個類代表了 Lucene 的索引的存儲的位置,這是一個抽象類,它目前有兩個實作,第一個是 FSDirectory,它表示一個存儲在檔案系統中的索引的位置。第二個是 RAMDirectory,它表示一個存儲在記憶體當中的索引的位置。

熟悉了建立索引所需要的這些類後,我們就開始對某個目錄下面的文本檔案建立索引了,清單1給出了對某個目錄下的文本檔案建立索引的源代碼。

執行個體:

// IK分詞器 private Analyzer analyzer = new IKAnalyzer(false); private Document document; private IndexWriter writer; private static File indexFile = new File("d:\\index"); // 分詞 TokenStream tokenStream = analyzer.reusableTokenStream("text", new StringReader("中華人民共和國")); TermAttribute term = (TermAttribute) tokenStream .getAttribute(TermAttribute.class); while (tokenStream.incrementToken()) { System.out.println(term.term()); } // 建立索引 writer = new IndexWriter(FSDirectory.open(indexFile), analyzer, false, IndexWriter.MaxFieldLength.LIMITED); document = new Document(); document.add(new Field("content", "北京你好", Field.Store.YES, Field.Index.ANALYZED)); document .add(new Field("id", "3", Field.Store.YES, Field.Index.ANALYZED)); writer.addDocument(document); writer.close();

TokenStream 是分詞的結果,可以得到目前分詞器分詞的結果集。

搜尋文檔

利用Lucene進行搜尋就像建立索引一樣也是非常友善的。在上面一部分中,我們已經為一個目錄下的文本文檔建立好了索引,現在我們就要在這個索引 上進行搜尋以找到包含某個關鍵詞或短語的文檔。Lucene提供了幾個基礎的類來完成這個過程,它們分别是呢IndexSearcher, Term, Query, TermQuery, Hits. 下面我們分别介紹這幾個類的功能。

Query

這是一個抽象類,他有多個實作,比如TermQuery, BooleanQuery, PrefixQuery. 這個類的目的是把使用者輸入的查詢字元串封裝成Lucene能夠識别的Query。

IndexSearcher

IndexSearcher是用來在建立好的索引上進行搜尋的。它隻能以隻讀的方式打開一個索引,是以可以有多個IndexSearcher的執行個體 在一個索引上進行操作。

Sort

Sort 使用時通過執行個體化對象作為參數,通過 Searcher 類的 search 接口來實作。 Sort 支援的排序功能以文檔當中的域為機關,通過這種方 法,可以實作一個或者多個不同域的多形式的值排序。

實際使用排序對象 Sort 進行排序。主要有兩種模式,一種是以字元串表示文檔域的名稱作為參數指定域排序,一種是直接以排序域的包裝域的包裝類作為參數進行排 序。

TopDocs

搜尋的結果集,存放複合條件的document集合。

Highlighter

比對值的高亮顯示,document中和關鍵詞相比對時,結果顯示高亮

Query query = IKQueryParser.parse("content", "北京"); // 索引查詢器 IndexSearcher searcher = new IndexSearcher(FSDirectory.open(indexFile)); searcher.setSimilarity(new IKSimilarity()); Sort sort = new Sort(); sort.setSort(new SortField("id", SortField.INT, false)); TopDocs docs = searcher.search(query, null, 10, sort); System.out.println("比對對象個數:" + docs.totalHits); ScoreDoc[] s = docs.scoreDocs; Highlighter highlighter = null; SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter( "<b><font color='red'>", "</font></b>"); highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer( query)); // 這個100是指定關鍵字字元串的context的長度 highlighter.setTextFragmenter(new SimpleFragmenter(100)); List<Message> list = new ArrayList<Message>(); for (int i = 0; i < s.length; i++) { Document d = searcher.doc(s[i].doc); System.out.println(d.get("id")); System.out.println(d.get("content")); String content = highlighter.getBestFragment(analyzer, "content", d .get("content")); System.out.println(content); list.add(new Message(d.get("id"), content)); } System.out.println(list.size()); searcher.close(); }

lucene核心類詳解

繼續閱讀