Hibernate Search 之 结果集高亮

使用Hibernate Search方便是方便,可是找出来的结果,都是一个个的实体。而当我想要

使用高亮时,就没那么简单了。一开始走了弯路,按照以前直接用 lucene 的经验,打算自己

找到 QueryHits,然后对 QueryHits的结果进行逐个的高亮。幸好及时搜索了一下,对我帮助

最大的就是 https://forums.hibernate.org/viewtopic.php?f=9&t=982678 这篇文章。

当然,这篇文章也有点复杂了,不知道为啥要对query进行rewrite。在我看来,帮助最大的就是

提醒了我,可以用 query.setProjection(FullTextQuery.THIS, FullTextQuery.DOCUMENT_ID,FullTextQuery.DOCUMENT,FullTextQuery.SCORE,FullTextQuery.BOOST);

来获取到 Document,以及Score。有了这个之后,事情就简单多了

 

public List<SearchResult> search(String value) throws Exception {
    Session session = getSession();
    FullTextSession fullTextSession = Search.getFullTextSession( session);
    StandardAnalyzer standardAnalyzer = new StandardAnalyzer( Version.LUCENE_CURRENT);
    QueryParser parser = new QueryParser( Version.LUCENE_CURRENT, "ALL", standardAnalyzer);
    Query query = parser.parse( value);
    FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery( query);
    fullTextQuery.setProjection(FullTextQuery.THIS, FullTextQuery.DOCUMENT, FullTextQuery.SCORE);

    Collection<Object[]>  queryResult = fullTextQuery.list();
    QueryScorer qs = new QueryScorer( query);
    Formatter formatter = new SimpleHTMLFormatter( "<b><font color=\"red\">", "</font></b>");
    Highlighter highlighter = new Highlighter( formatter, qs);
    List<SearchResult> result = new ArrayList<SearchResult>();
    for ( Object[] objs: queryResult ) {
        Document document = (Document) objs[1];
        org.apache.lucene.document.Field field = document.getField("ALL");
        String[] highlight = highlighter.getBestFragments( standardAnalyzer, "ALL", field.stringValue(), 5);
        // 这儿就是处理如何返回结果了
    }

    return result;
}

 

当然,前提是你的这些内容要是Store.YES才行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值