高亮顯示查詢項(xiàng)
有一個(gè)能使搜索引擎變得更友好的辦法,那就是向你的用戶提供一些搜索命中結(jié)果的上下文,而且更為重要的是這樣做是非常有用 的。最好的例子就是本系統(tǒng)用戶在查找天氣Web服務(wù)時(shí)的搜索結(jié)果。如下圖1所示,每個(gè)命中結(jié)果包括了匹配文檔的三行左右的內(nèi)容,并且將查詢項(xiàng)高亮顯示出 來。通常,我們只需要對搜索項(xiàng) 上下文內(nèi)容瀏覽一眼就足以 了解該結(jié)果是否值得我們深入地進(jìn)行研究。
圖4.1 高亮顯示查詢項(xiàng)
Highlighter 最近已經(jīng)充分升級為一個(gè)復(fù)雜而靈活的工具。Highlighter包括了三個(gè)主要部分:段劃分器(Fragmenter)、計(jì)分器(Scorer)和格式 化器(Formatter)。這幾個(gè)部分對應(yīng)于Java的同名接口,并且每部分都有一個(gè)內(nèi)置的實(shí)現(xiàn)以便我們使用。最簡單的Highlighter將返回在 匹配項(xiàng)周圍的最佳段落,并使用HTML的<B>將這些項(xiàng)標(biāo)記出來:
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));
前述代碼將產(chǎn)生如下輸出
The quick brown <B>fox</B> jumps over the lazy dog
Highlighter不僅需要你提供記分器和需要高亮顯示的文本,還需要一個(gè)TokenStream實(shí)例。這個(gè)TokenStream實(shí)例是由分析器生 成的。為了成功地對項(xiàng)進(jìn)行高亮顯示,Query中的這些項(xiàng)需要匹配TokenStream產(chǎn)生的Token實(shí)例。我們提供的文本則被用于生成 TokenStream,而這個(gè)TokenStream又被用作高亮顯示的原始文本。每個(gè)由TokenStream生成的Token實(shí)例都包含語匯單元的 位置信息,這些信息用來指示原始文本中高亮部分的起始和結(jié)束位置。
Highlighter利用Fragmenter將原始文本分割成多個(gè)片段。內(nèi)置的SimpleFragmenter將原始文本分割成相同大小的片段,片段默認(rèn)的大小為100個(gè)字符。這個(gè)大小是可控制的。
QueryScorer是內(nèi)置的計(jì)分器。計(jì)分器的工作首先是將片段排序。QueryScorer使用的項(xiàng)是從用戶輸入的查詢中得到的;它會從原始輸入的單 詞、詞組和布爾查詢中提取項(xiàng),并且基于相應(yīng)的加權(quán)因子(boost factor)給它們加權(quán)。為了便于QueryScoere使用,還必須對查詢的原始形式進(jìn)行重寫。比如,帶通配符查詢、模糊查詢、前綴查詢以及范圍查詢 等,都被重寫為BoolenaQuery中所使用的項(xiàng)。在將Query實(shí)例傳遞到QueryScorer之前,可以調(diào)用 Query.rewrite(IndexReader)方法來重寫Query對象(否則,你必須確保用戶輸入的查詢文本就是Lucene直接可以處理最基 本的項(xiàng))。
最后,格式化器(Formatter)用于裝飾項(xiàng)文本。如果不指定其他的格式化器,Lucene會默認(rèn)使用內(nèi)置的格式化器 SimpleHTMLFormatter,這個(gè)格式化器將會用HTML的黑體開始標(biāo)簽(begin bold tags <B>)和黑體結(jié)束標(biāo)簽(end bold tags </B>)來標(biāo)識出高亮顯示的項(xiàng)文本。Highlighter默認(rèn)地使用SimpleHTMLFormatter和 SimpleFragmenter這兩個(gè)格式化器。每一個(gè)由Formatter高亮顯示的項(xiàng)都將會帶有一個(gè)語匯單元評分。當(dāng)使用QueryScorer 時(shí),這個(gè)評分將作為查詢該項(xiàng)的加權(quán)因子。這個(gè)語匯單元評分能夠被用來決定該項(xiàng)的重要性。要利用這個(gè)特性就必須實(shí)現(xiàn)自定義的格式化器。
注:我們項(xiàng)目所用到的 Lucene API是基于最新版Lucene2.1的,如果你用的是以前版本可能這些例子不能很好的運(yùn)行。不過我覺得看了以上的東西,再結(jié)合網(wǎng)上大量的Lucene資 料還有一些例子就能對Lucene有一定的理解了,最起碼就可以開始使用Lucene著手項(xiàng)目了。
另外,在文章開始提到了,我們以前一起做項(xiàng)目時(shí)沒有使用過Lucene,這次是我們團(tuán)隊(duì)的趙寧同學(xué)開始接觸Lucene,然后在我們項(xiàng)目中使用這個(gè)工具, 我是在他指導(dǎo)的基礎(chǔ)上對Lucene有一點(diǎn)點(diǎn)的理解而已。感興趣的可以就項(xiàng)目中的更細(xì)節(jié)問題跟趙寧同學(xué)聯(lián)系:MSN:program- maker@hotmail.com
ExtJS教程- Hibernate教程-Struts2 教程-Lucene教程
有一個(gè)能使搜索引擎變得更友好的辦法,那就是向你的用戶提供一些搜索命中結(jié)果的上下文,而且更為重要的是這樣做是非常有用 的。最好的例子就是本系統(tǒng)用戶在查找天氣Web服務(wù)時(shí)的搜索結(jié)果。如下圖1所示,每個(gè)命中結(jié)果包括了匹配文檔的三行左右的內(nèi)容,并且將查詢項(xiàng)高亮顯示出 來。通常,我們只需要對搜索項(xiàng) 上下文內(nèi)容瀏覽一眼就足以 了解該結(jié)果是否值得我們深入地進(jìn)行研究。
圖4.1 高亮顯示查詢項(xiàng)
Highlighter 最近已經(jīng)充分升級為一個(gè)復(fù)雜而靈活的工具。Highlighter包括了三個(gè)主要部分:段劃分器(Fragmenter)、計(jì)分器(Scorer)和格式 化器(Formatter)。這幾個(gè)部分對應(yīng)于Java的同名接口,并且每部分都有一個(gè)內(nèi)置的實(shí)現(xiàn)以便我們使用。最簡單的Highlighter將返回在 匹配項(xiàng)周圍的最佳段落,并使用HTML的<B>將這些項(xiàng)標(biāo)記出來:
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));
前述代碼將產(chǎn)生如下輸出
The quick brown <B>fox</B> jumps over the lazy dog
Highlighter不僅需要你提供記分器和需要高亮顯示的文本,還需要一個(gè)TokenStream實(shí)例。這個(gè)TokenStream實(shí)例是由分析器生 成的。為了成功地對項(xiàng)進(jìn)行高亮顯示,Query中的這些項(xiàng)需要匹配TokenStream產(chǎn)生的Token實(shí)例。我們提供的文本則被用于生成 TokenStream,而這個(gè)TokenStream又被用作高亮顯示的原始文本。每個(gè)由TokenStream生成的Token實(shí)例都包含語匯單元的 位置信息,這些信息用來指示原始文本中高亮部分的起始和結(jié)束位置。
Highlighter利用Fragmenter將原始文本分割成多個(gè)片段。內(nèi)置的SimpleFragmenter將原始文本分割成相同大小的片段,片段默認(rèn)的大小為100個(gè)字符。這個(gè)大小是可控制的。
QueryScorer是內(nèi)置的計(jì)分器。計(jì)分器的工作首先是將片段排序。QueryScorer使用的項(xiàng)是從用戶輸入的查詢中得到的;它會從原始輸入的單 詞、詞組和布爾查詢中提取項(xiàng),并且基于相應(yīng)的加權(quán)因子(boost factor)給它們加權(quán)。為了便于QueryScoere使用,還必須對查詢的原始形式進(jìn)行重寫。比如,帶通配符查詢、模糊查詢、前綴查詢以及范圍查詢 等,都被重寫為BoolenaQuery中所使用的項(xiàng)。在將Query實(shí)例傳遞到QueryScorer之前,可以調(diào)用 Query.rewrite(IndexReader)方法來重寫Query對象(否則,你必須確保用戶輸入的查詢文本就是Lucene直接可以處理最基 本的項(xiàng))。
最后,格式化器(Formatter)用于裝飾項(xiàng)文本。如果不指定其他的格式化器,Lucene會默認(rèn)使用內(nèi)置的格式化器 SimpleHTMLFormatter,這個(gè)格式化器將會用HTML的黑體開始標(biāo)簽(begin bold tags <B>)和黑體結(jié)束標(biāo)簽(end bold tags </B>)來標(biāo)識出高亮顯示的項(xiàng)文本。Highlighter默認(rèn)地使用SimpleHTMLFormatter和 SimpleFragmenter這兩個(gè)格式化器。每一個(gè)由Formatter高亮顯示的項(xiàng)都將會帶有一個(gè)語匯單元評分。當(dāng)使用QueryScorer 時(shí),這個(gè)評分將作為查詢該項(xiàng)的加權(quán)因子。這個(gè)語匯單元評分能夠被用來決定該項(xiàng)的重要性。要利用這個(gè)特性就必須實(shí)現(xiàn)自定義的格式化器。
注:我們項(xiàng)目所用到的 Lucene API是基于最新版Lucene2.1的,如果你用的是以前版本可能這些例子不能很好的運(yùn)行。不過我覺得看了以上的東西,再結(jié)合網(wǎng)上大量的Lucene資 料還有一些例子就能對Lucene有一定的理解了,最起碼就可以開始使用Lucene著手項(xiàng)目了。
另外,在文章開始提到了,我們以前一起做項(xiàng)目時(shí)沒有使用過Lucene,這次是我們團(tuán)隊(duì)的趙寧同學(xué)開始接觸Lucene,然后在我們項(xiàng)目中使用這個(gè)工具, 我是在他指導(dǎo)的基礎(chǔ)上對Lucene有一點(diǎn)點(diǎn)的理解而已。感興趣的可以就項(xiàng)目中的更細(xì)節(jié)問題跟趙寧同學(xué)聯(lián)系:MSN:program- maker@hotmail.com
ExtJS教程- Hibernate教程-Struts2 教程-Lucene教程