对查询内容分页,那是必须的。当然最好是能够对所查询的关键字进行高亮显示。
对于高亮有直接的api,但是对于分页。虽然没有直接的方法,但也有类似于hibernate分页的方法,但我们可以用
IndexSearcher提供的doc方法,直接通过数组下标来获取该组对象集合。
此例在myeclipse8.5++tomcat6+jdk1.6+lucene3.0.2+struts2.2.1+freemarker-2.3.16下测试通过
效果图:
做的很简单,只是为了展现高亮+分页的效果
这个分页效果是我第一篇博客的仿QQ的效果。嘿嘿。推销一下。
http://hellotommy.iteye.com/blog/785242
一:高亮部分代码
SimpleHTMLFormatter simpleHtmlFormatter = new SimpleHTMLFormatter("<b><font color='red'>","</font></b>"); //高亮样式,粗体+red
Highlighter highlighter = new Highlighter(simpleHtmlFormatter,new QueryScorer(query)); //对查询出来的query进行高亮设置
highlighter.setTextFragmenter(new SimpleFragmenter(100)); //关键字两旁字数
TokenStream tokenStream1 = analyzer.tokenStream("newsTitle",new StringReader(resultDoc.get("newsTitle"))); //TokenStream用来分析文字流
TokenStream tokenStream2 = analyzer.tokenStream("newsContent",new StringReader(resultDoc.get("newsContent")));
String bestFragment1 = highlighter.getBestFragment(tokenStream1, resultDoc.get("newsTitle")); //匹配样式
String bestFragment2 = highlighter.getBestFragment(tokenStream2, resultDoc.get("newsContent"));
二:分页部分
List<News> newsList=new ArrayList<News>();
for (int i = firstResult; i < firstResult+maxResult ; i++){ //按照分页的序号遍历。
News news=new News();
Document resultDoc = isearcher.doc(docs[i].doc);
news.setNewsId(resultDoc.get("newsId"));
.....newsList.add(news); //讲对象加入集合中
}
大致就是以上这样子。
分页采用lucene官方推荐的,每次都对索引进行检索,虽然效率并不高,但操作相对简单很多。就跟普通分页
一样。