关于springDataSolr搜索高亮关键字的实现
com.pinyougou.search.service.impl;/*
ClassName:ItemSearchServiceImpl
Author: Lzc
Company:www.lzc.com
Date: 2018/11/12 11:15
*/
import com.alibaba.dubbo.config.annotation.Service;
import com.pinyougou.search.service.ItemSearchService;
import entity.SolrItem;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.solr.core.SolrTemplate;
import org.springframework.data.solr.core.query.Criteria;
import org.springframework.data.solr.core.query.HighlightOptions;
import org.springframework.data.solr.core.query.SimpleHighlightQuery;
import org.springframework.data.solr.core.query.result.HighlightEntry;
import org.springframework.data.solr.core.query.result.HighlightPage;
import java.util.HashMap;
import java.util.Map;
//设置请求超时间,dubbo默认是1秒
@Service(timeout = 5000)
public class ItemSearchServiceImpl implements ItemSearchService {
@Autowired
private SolrTemplate solrTemplate;
@Override
public Map search(Map searchMap) {
Map result = new HashMap();
///构造查询对象
Query query=new SimpleQuery(":");
//组装查询条件
String keywords=searchMap.get(“keywords”) == null ? null:searchMap.get(“keywords”).toString();
//关键字条件
//关键字条件
if (StringUtils.isNotBlank(keywords)) {
Criteria criteria = new Criteria(“item_keywords”).is(keywords);
query.addCriteria(criteria);
}
//分页查询数据列表
ScoredPage page = solrTemplate.queryForPage(query, SolrItem.class);/
//2.构建query高亮查询对象new SimpleHighlightQuery
SimpleHighlightQuery query = new SimpleHighlightQuery();
//3.复制之前的Criteria组装查询条件的代码
//组装查询条件
String keywords=searchMap.get("keywords") == null ? null:searchMap.get("keywords").toString();
//关键字条件
//关键字条件
if (StringUtils.isNotBlank(keywords)) {
Criteria criteria = new Criteria("item_keywords").is(keywords);
query.addCriteria(criteria);
}
//4.调用query.setHighlightOptions()方法,构建高亮数据三步曲:
// new HighlightOptions().addField(高亮业务域),
// .setSimpleP..(前缀),
// .setSimpleP..(后缀)
HighlightOptions hOptions = new HighlightOptions();
hOptions.addField("item_title");
hOptions.setSimplePrefix("<em style=\"color:red;\">");
hOptions.setSimplePostfix("</em>");
query.setHighlightOptions(hOptions);
//5.接收solrTemplate.queryForHighlightPage的返回数据,定义page变量
//1.调用solrTemplate.queryForHighlightPage(query,class)方法,高亮查询数据
HighlightPage<SolrItem> page = solrTemplate.queryForHighlightPage(query, SolrItem.class);
//6.遍历解析page对象,page.getHighlighted().for,item = h.getEntity(),item.setTitle(h.getHighlights().get(0).
// getSnipplets().get(0)),在设置高亮之前最好判断一下;
for (HighlightEntry<SolrItem> h : page.getHighlighted()) {
SolrItem item = h.getEntity();
//修改title,使用高亮
if (h.getHighlights().size()>0&&h.getHighlights().get(0).getSnipplets().size()>0){
item.setTitle(h.getHighlights().get(0).getSnipplets().get(0));
}
}
//7.在循环完成外map.put("rows", page.getContent())返回数据列表
//返回商品列表
result.put("rows", page.getContent());
return result;
}
}
- h.getHighlights() 获取每条高亮记录的所有高亮域
- 在new HighlightOptions().addField(“item_title”)是添加的高亮域
- h.getHighlights().get(0).getSnipplets()获取第一个高亮域的内容
- h.getHighlights().get(0).getSnipplets().get(0) 一个高亮域中可能存在多值
- 取决于solr中的配置域的是否配置了multiValued是否为true