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