排序查询
1 需求分析
實現按銷量排序、新品排序、評論排序和價格排序
2 實現思路
如果是降序,則指定order為desc
3 代碼實現
修改SearchServiceImpl的search方法,在第1段代碼中添加代碼
package com.changgou.service;import org.apache.commons.lang.StringUtils; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.common.text.Text; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.MatchQueryBuilder;import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; import org.elasticsearch.search.fetch.subphase.highlight.HighlightField; import org.elasticsearch.search.sort.SortOrder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;/*** @author :lijunxuan* @date :Created in 2019/7/17 19:00* @description :* @version: 1.0*/ @Service public class SearchServiceImpl implements SearchService {@Autowiredprivate RestHighLevelClient restHighLevelClient;//設置每頁查詢條數據public final static Integer PAGE_SIZE = 4;@Overridepublic Map search(Map<String, String> paramMap) throws Exception {Map<String,Object> resultMap=new HashMap<>();/*** 1.獲取查詢參數*///查詢關鍵字String keywords = paramMap.get("keywords");//當前頁數String pageNo = paramMap.get("pageNo");//按照什么域進行排序String sort = paramMap.get("sort");//排序方式是升序還是降序String sortOrder = paramMap.get("sortOrder");/*** 2.獲取查詢需要的對象*///創建查詢對象,指定索引庫名稱,_indexSearchRequest searchRequest = new SearchRequest("sku");//指定查詢索引庫中的類型searchRequest.types("doc");//創建查詢構造對象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//創建布爾查詢(組合查詢對象)BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();/*** 3.設置根據關鍵字查詢(關鍵字需要中文分詞)*/MatchQueryBuilder nameQueryBuilder = QueryBuilders.matchQuery("name", keywords);//根據名稱查詢條件放入組合查詢對象中boolQueryBuilder.must(nameQueryBuilder);/*** 4. 設置高亮查詢*/HighlightBuilder highlightBuilder = new HighlightBuilder();//設置在哪個域中高亮顯示highlightBuilder.field("name");//設置高亮前綴highlightBuilder.preTags("<em style=\"color:red\">");//設置高亮后綴highlightBuilder.postTags("</em>");searchSourceBuilder.highlighter(highlightBuilder);/*** 5. 設置分頁查詢*/if (StringUtils.isEmpty(pageNo)) {paramMap.put("pageNo", "1");resultMap.put("pageNo", "1");}Integer pageNoTemp = Integer.parseInt(pageNo);if (pageNoTemp < 1) {paramMap.put("pageNo", "1");resultMap.put("pageNo", "1");pageNoTemp = 1;}//從第幾條開始查詢Integer start = (pageNoTemp - 1) * PAGE_SIZE;//從第幾條開始查詢searchSourceBuilder.from(start);//每頁查詢多少條數據searchSourceBuilder.size(PAGE_SIZE);/*** 6. 設置排序查詢*/if (!StringUtils.isEmpty(sort)) {//升序if ("ASC".equals(sortOrder)) {searchSourceBuilder.sort(sort, SortOrder.ASC);}//降序if ("DESC".equals(sortOrder)) {searchSourceBuilder.sort(sort, SortOrder.DESC);}}/*** 12.查詢并返回的結果*///將組合查詢條件放入查詢構造對象中searchSourceBuilder.query(boolQueryBuilder);//將組合查詢條件放入查詢請求中searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);/*** 13. 獲取查詢到的結果集, 封裝后返回*/SearchHits searchHits = searchResponse.getHits();//獲取查詢到的總條數long totalHits = searchHits.getTotalHits();resultMap.put("total",totalHits);//獲取查詢結果集SearchHit[] hits = searchHits.getHits();List rows = new ArrayList<>();if (hits!=null){for (SearchHit hit : hits) {//獲取普通的查詢出來的一條數據(不帶高亮名稱)Map<String, Object> sourceAsMap = hit.getSourceAsMap();//獲取高亮結果Map<String, HighlightField> highlightFields = hit.getHighlightFields();if (highlightFields != null) {HighlightField highlightField = highlightFields.get("name");Text[] fragments = highlightField.fragments();if (fragments != null && fragments.length > 0) {//將高亮名稱放入查詢出來的數據中, 覆蓋原來不帶高亮的名稱sourceAsMap.put("name", fragments[0].toString());}}rows.add(sourceAsMap);}}resultMap.put("rows",rows);return resultMap;} }4測試結果
總結