高亮顯示查詢項

有一個能使搜索引擎變得更友好的辦法,那就是向你的用戶提供一些搜索命中結果的上下文,而且更為重要的是這樣做是非常有用 的。最好的例子就是本系統用戶在查找天氣Web服務時的搜索結果。如下圖1所示,每個命中結果包括了匹配文檔的三行左右的內容,并且將查詢項高亮顯示出 來。通常,我們只需要對搜索項 上下文內容瀏覽一眼就足以 了解該結果是否值得我們深入地進行研究。




圖4.1 高亮顯示查詢項


Highlighter 最近已經充分升級為一個復雜而靈活的工具。Highlighter包括了三個主要部分:段劃分器(Fragmenter)、計分器(Scorer)和格式 化器(Formatter)。這幾個部分對應于Java的同名接口,并且每部分都有一個內置的實現以便我們使用。最簡單的Highlighter將返回在 匹配項周圍的最佳段落,并使用HTML的<B>將這些項標記出來:

String text = “The quick brown fox jumps over the lazy dog”;
TermQuery query = new TermQuery(new Term(“field”, “fox”));
Scorer scorer = new QueryScorer(query);
Highlighter highlighter = new Highlighter(scorer);
TokenStream tokenStream =
new SimpleAnalyzer().tokenStream(“field”,
new StringReader(text));
System.out.println(highlighter.getBestFragment(tokenStream,text));
前述代碼將產生如下輸出

The quick brown <B>fox</B> jumps over the lazy dog

Highlighter不僅需要你提供記分器和需要高亮顯示的文本,還需要一個TokenStream實例。這個TokenStream實例是由分析器生 成的。為了成功地對項進行高亮顯示,Query中的這些項需要匹配TokenStream產生的Token實例。我們提供的文本則被用于生成 TokenStream,而這個TokenStream又被用作高亮顯示的原始文本。每個由TokenStream生成的Token實例都包含語匯單元的 位置信息,這些信息用來指示原始文本中高亮部分的起始和結束位置。

Highlighter利用Fragmenter將原始文本分割成多個片段。內置的SimpleFragmenter將原始文本分割成相同大小的片段,片段默認的大小為100個字符。這個大小是可控制的。

QueryScorer是內置的計分器。計分器的工作首先是將片段排序。QueryScorer使用的項是從用戶輸入的查詢中得到的;它會從原始輸入的單 詞、詞組和布爾查詢中提取項,并且基于相應的加權因子(boost factor)給它們加權。為了便于QueryScoere使用,還必須對查詢的原始形式進行重寫。比如,帶通配符查詢、模糊查詢、前綴查詢以及范圍查詢 等,都被重寫為BoolenaQuery中所使用的項。在將Query實例傳遞到QueryScorer之前,可以調用 Query.rewrite(IndexReader)方法來重寫Query對象(否則,你必須確保用戶輸入的查詢文本就是Lucene直接可以處理最基 本的項)。

最后,格式化器(Formatter)用于裝飾項文本。如果不指定其他的格式化器,Lucene會默認使用內置的格式化器 SimpleHTMLFormatter,這個格式化器將會用HTML的黑體開始標簽(begin bold tags <B>)和黑體結束標簽(end bold tags </B>)來標識出高亮顯示的項文本。Highlighter默認地使用SimpleHTMLFormatter和 SimpleFragmenter這兩個格式化器。每一個由Formatter高亮顯示的項都將會帶有一個語匯單元評分。當使用QueryScorer 時,這個評分將作為查詢該項的加權因子。這個語匯單元評分能夠被用來決定該項的重要性。要利用這個特性就必須實現自定義的格式化器。

注:我們項目所用到的 Lucene API是基于最新版Lucene2.1的,如果你用的是以前版本可能這些例子不能很好的運行。不過我覺得看了以上的東西,再結合網上大量的Lucene資 料還有一些例子就能對Lucene有一定的理解了,最起碼就可以開始使用Lucene著手項目了。
另外,在文章開始提到了,我們以前一起做項目時沒有使用過Lucene,這次是我們團隊的趙寧同學開始接觸Lucene,然后在我們項目中使用這個工具, 我是在他指導的基礎上對Lucene有一點點的理解而已。感興趣的可以就項目中的更細節問題跟趙寧同學聯系:MSN:program- maker@hotmail.com

ExtJS教程- Hibernate教程-Struts2 教程-Lucene教程