solr(6)搜索结果高亮

1、设置高亮

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SolrQuery query = new SolrQuery();
...
//高亮
query.setHighlight(true);
//设置需要高亮的字段
query.addHighlightField("path");
query.addHighlightField("content");
//设置高亮字段中匹配内容的前缀和后缀,实现HTML高亮显示
query.setHighlightSimplePre("<font color='red'>");
query.setHighlightSimplePost("</font>");
/**
* 高亮摘要的段数,默认为1
* 大于1时,返回多个包含关键字的摘要段落
* 等于1时,只返回包含关键字最多的段落
*/
query.setHighlightSnippets(3);
/**
* 摘要段落的长度,默认100
*/
query.setHighlightFragsize(75);

2、获取高亮

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
QueryResponse queryResponse = solr.query(query);
SolrDocumentList results = queryResponse.getResults();

Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
for(SolrDocument solrDocument : results){

//自定义的pojo类
TXDocument document = new TXDocument();
document.setId(solrDocument.get("id").toString());

//高亮匹配结果
Map<String, List<String>> map = highlighting.get(solrDocument.get("id"));

// 获取path字段。如果path字段有高亮匹配,则获取高亮匹配结果;否则获取全部内容
if(map.get("path") != null){
document.setPath(map.get("path").toString());
} else {
document.setPath(solrDocument.get("path").toString());
}

// 获取内content字段。如果content字段有高亮匹配,则获取高亮匹配结果;否则获取前75个字的内容
String matchContents = "";
List<String> list = map.get("content");
if(list != null){
for(int i=0;i<list.size();i++){
if(i != 0){
matchContents += " . . . ";
}
matchContents += list.get(i);
}
} else {
String docContent = solrDocument.get("content").toString();
matchContents = (docContent.length() > 75?docContent.substring(0, 75):docContent);
}
document.setContent(matchContents);
}

3、效果

这里写图片描述