版权声明:www.hsboy.cn [email protected] https://blog.csdn.net/oHongShu1/article/details/88640553
今天想到要把自己的网站查询关键字高亮显示,使用Solr的Highlighting功能。但是参考了一些博客后,发现并不完整或者有些错误,就去看官网的文档,完成功能后将这一经验分享出来。
先上效果图
开始
- 我按照查到的其他博客操作下来,发现Highlighting根本没有返回值,这是因为他们漏掉了很重要的一点,我们来看solr官网对Highlighting的介绍
- 第一句,Solr文档就说 You only need to set the hl and often hl.fl parameters to get results.也就是说必须开启hl并且设置hl.fl。其他博客忽略的就是设置hl…fl,就是设置哪一字段使用高亮,对应的SolrJ就是开启query.setHighlight(true);、设置query.set(“hl.fl”, “title_cn”);
下面我们来看solrj详细写法
@Test
public void hl() throws SolrServerException, IOException {
SolrQuery query = new SolrQuery();
query.set("q", "title_cn:男");
query.setHighlight(true);//必须开启
query.set("hl.fl", "title_cn");//必须开启,这里选择你要使用高亮的solr字段
query.setHighlightSimplePre("<strong style='color:blue;'>");//可选,默认<em>
query.setHighlightSimplePost("</strong>");//可选,默认</em>
QueryResponse response = solrClient.query(query);
// NamedList list = (NamedList) response.getResponse().get("highlighting");
Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
// 下面是highlighting=response.getHighlighting();的返回结果
// {e3c5d6da-8315-4127-a0e9-4a4ebda49638={title_cn=[HLA海澜之家动物印花卫衣2019春季新品红<em>男</em>系列经典圆领卫衣<em>男</em>HNZWJ1R006A大红花纹06170/88A/M]},
// 4be0f556-bc50-48a9-aabe-94d9e60c1a54={title_cn=[HLA海澜之家简约带帽款夹克2019春季新品净色大方夹克外套<em>男</em>HWJAD1R041A黑色41180/96A/XL]},
// 69c7bfa1-f785-4a52-a940-94e98fa1d408={title_cn=[臻杰龙牛仔外套男装夹克修身短外套秋冬季加绒加厚休闲男生韩版潮流衣服<em>男</em>春秋棒球服 咖啡色MY8815 XL]},
// ed8d66b3-36d5-48a6-823d-d4fca546108d={title_cn=[三福2018秋装新品<em>男</em>腰头贴标牛仔裤 合身直筒休闲牛仔裤<em>男</em>389795 中蓝 33(175/84A)]}}
List<SolrMallEntity> solrBeans = response.getBeans(SolrMallEntity.class);
//下面的代码按照你的需求定制
for (SolrMallEntity solrMallEntity : solrBeans) {
String string = highlighting.get(solrMallEntity.getId()).get("title_cn").get(0);
solrMallEntity.setTitle_cn(string);
}
for (SolrMallEntity solrMallEntity : solrBeans) {
System.out.println(solrMallEntity);
}
}
总结
- query.setHighlight(true);、query.set(“hl.fl”, “title_cn”);必须设置!功能分别是开启高亮和使用高亮的solr字段
query.setHighlightSimplePre
和query.setHighlightSimplePost
就是对匹配到的关键词,前后插入什么内容,一般定义为html结点,如果你不设置,默认使用<em>
和</em>
,因此你可以在html
页面用css
定义em标签
的样式,或者如果你的高亮格式简单的话,也可以像我这样,直接自定义,使用加粗和颜色。
注意
- response.getBeans(SolrMallEntity.class);得到的内容是默认的功能,并没有添加高亮,如果要获得高亮内容,需要使用response.getHighlighting();,二者需要结合使用,参考上面的代码