关于springDataSolr搜索高亮关键字的实现

关于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

猜你喜欢

转载自blog.csdn.net/weixin_43241124/article/details/84026303
今日推荐