1. 程式人生 > >關於springDataSolr搜尋高亮關鍵字的實現

關於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