高亮显示查询项

有一个能使搜索引擎变得更友好的办法,那就是向你的用户提供一些搜索命中结果的上下文,而且更为重要的是这样做是非常有用 的。最好的例子就是本系统用户在查找天气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教程