后端:
//高亮配置 把Query 换成 HighlightQuery
HighlightQuery query = new SimpleHighlightQuery(new SimpleStringCriteria("*:*"));
//配置高亮选项
HighlightOptions highlightOptions = new HighlightOptions();
//高亮域
highlightOptions.addField("item_title");
//前缀
highlightOptions.setSimplePrefix("<span style=\"color:red;\">");
//后缀
highlightOptions.setSimplePostfix("</span>");
//设置高亮选项
query.setHighlightOptions(highlightOptions);
//高亮查询
HighlightPage<Item> highlightPage = solrTemplate.queryForHighlightPage(query, Item.class);
//获取高亮数据
List<HighlightEntry<Item>> highlighted = highlightPage.getHighlighted();
for (HighlightEntry<Item> itemHighlightEntry : highlighted) {
//获取SKU信息
Item item = itemHighlightEntry.getEntity();
//获取高亮数据
List<HighlightEntry.Highlight> highlights = itemHighlightEntry.getHighlights();
//高亮数据
if(highlights!=null && highlights.size()>0 && highlights.get(0).getSnipplets()!=null && highlights.get(0).getSnipplets().size()>0){
String snipplets = highlights.get(0).getSnipplets().get(0);
//替换高亮数据
item.setTitle(snipplets);
}
}
dataMap.put("rows",highlightPage.getContent());
具体代码:分页+高亮:
public Map<String, Object> search(Map searchMap) {
//使用高亮查询
HighlightQuery query = new SimpleHighlightQuery (new SimpleStringCriteria ("*:*"));
highlightConfig (query);
if (searchMap != null) {
//如果searchMap不为null;则根据关键词进行搜索;关键词都为字符串
String keyword = (String) searchMap.get ("keyword");
//关键词搜索从标题、品牌、商家名字、分类名字
if (StringUtils.isNoneBlank (keyword)) {
//关键词不为空:创建条件进行搜索--->进行过滤搜索
//.is表示在索引库里面搜索包含keyword的数据
Criteria criteria = new Criteria ("item_keywords").is (keyword);
//添加查询条件
query.addCriteria (criteria);
}
}
//设置分页展示:下标从0开始,一页显示30条数据
query.setOffset (0);
query.setRows (30);
//-----------------------------------高亮域的替换显示
//获取socredPage对象
HighlightPage<Item> scoredPage = solrTemplate.queryForHighlightPage (query, Item.class);
highlightReplace (scoredPage);
//返回1:获取Item所有数据
List<Item> itemList = scoredPage.getContent ();
//返回2:显示多少条数据
long totalElements = scoredPage.getTotalElements ();
//将数据封装成Map集合进行返回
Map<String, Object> dataMap = new HashMap<String, Object> ();
dataMap.put ("rows", itemList);
dataMap.put ("total", totalElements);
return dataMap;
}
public void highlightConfig(HighlightQuery query) {
HighlightOptions highlightOptions = new HighlightOptions ();
//高亮域的设置:1 高亮域 2 前缀、后缀
highlightOptions.addField ("item_title");
highlightOptions.setSimplePrefix ("<span style='color:red;'>");
highlightOptions.setSimplePostfix ("</span>");
//将高亮配置设置到高亮选项中
query.setHighlightOptions (highlightOptions);
}
public void highlightReplace(HighlightPage<Item> scoredPage) {
//获取所有数据 所有数据,拥有[高亮]也拥有[非高亮]
List<HighlightEntry<Item>> highlighted = scoredPage.getHighlighted ();
//循环所有数据
for (HighlightEntry<Item> itemHighlightEntry : highlighted) {
//获取非高亮数据
Item item = itemHighlightEntry.getEntity ();
//获取高亮值 [如果只有一个高亮域,则集合中只有一条数据]
List<HighlightEntry.Highlight> highlights = itemHighlightEntry.getHighlights ();
if (highlights != null && highlights.size () > 0) {
//普通高亮值
HighlightEntry.Highlight highlight = highlights.get (0);
//获取高亮碎片
List<String> snipplets = highlight.getSnipplets ();
if (snipplets!=null&&snipplets.size ()>0){
//获取高亮碎片
StringBuffer buffer = new StringBuffer ();
for (String snipplet : snipplets) {
buffer.append (snipplet);
}
//将非高亮替换成高亮
item.setTitle (buffer.toString ());
}
}
}
}
前端配置:----------->用于解决高亮字体不显示的问题
修改base.js
/*$sce服务写成过滤器*/
app.filter('trustHtml',['$sce',function($sce){
return function(data){
return $sce.trustAsHtml(data);
}
}]);
将要显示的
<div class="attr" ng-bind-html="item.title | trustHtml">
<em>{{item.title}}</em>
</div>