springDataSolr搜尋關鍵詞高亮的實現
阿新 • • 發佈:2019-01-09
@Service(timeout=5000) public class ItemSearchServiceImpl implements ItemSearchService{ @Autowired private SolrTemplate solrTemplate; @Override public Map<String, Object> search(Map searchMap) { Map<String,Object> map=new HashMap(); //putAll可以合併兩個MAP,只不過如果有相同的key那麼用後面的覆蓋前面的 map.putAll(searchList(searchMap)); return map; } private Map searchList(Map searchMap) { Map<String,Object> map=new HashMap(); /*Query query=new SimpleQuery(); //新增查詢條件 Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords")); query.addCriteria(criteria); ScoredPage<TbItem> page=solrTemplate.queryForPage(query,TbItem.class); map.put("rows", page.getContent());*/ //高亮查詢 HighlightQuery query=new SimpleHighlightQuery(); HighlightOptions highlightOptions = new HighlightOptions().addField("item_title");//新增高亮域 highlightOptions.setSimplePrefix("<em style='color:red'>");//高亮字首 highlightOptions.setSimplePostfix("</em>");//高亮字尾 query.setHighlightOptions(highlightOptions);//將高亮域相關查詢條件新增到query中 //按照關鍵字查詢 Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords")); //新增查詢條件 query.addCriteria(criteria); //獲得高亮頁物件,包含所有的高亮記錄,一條記錄為一個TbItem HighlightPage<TbItem> queryForHighlightPage = solrTemplate.queryForHighlightPage(query, TbItem.class); //獲取所有的高亮記錄 List<HighlightEntry<TbItem>> highlighted = queryForHighlightPage.getHighlighted(); //迴圈高亮入口,獲取每一條記錄 for(HighlightEntry<TbItem> h:highlighted) { TbItem item=h.getEntity();//獲取記錄中的實體類 if(h.getHighlights().size()>0&&h.getHighlights().get(0).getSnipplets().size()>0) { item.setTitle(h.getHighlights().get(0).getSnipplets().get(0));//設定高亮域的結果 } } /** * * 以上操作是對原生內容的修改封裝 */ //不進行如上操作,獲取的是原生的物件,即是沒有經過高亮處理的物件 map.put("rows",queryForHighlightPage.getContent()); return map; }
/**
* h.getHighlights() 獲取每條高亮記錄的所有高亮域
* 在new HighlightOptions().addField("item_title")是新增的高亮域
* h.getHighlights().get(0).getSnipplets()獲取第一個高亮域的內容
* h.getHighlights().get(0).getSnipplets().get(0) 一個高亮域中可能存在多值
* 取決於solr中的配置域的是否配置了multiValued是否為true
*/