分类列表查询
1 需求分析
以關鍵字作為查詢條件,查詢結果中包含的商品分類,在頁面中顯示出來
2 實現思路
(1)商品分類列表的顯示使用聚合查詢
(2)使用過濾查詢
3 代碼實現
修改SearchServiceImpl的search方法,在第一段代碼(封裝查詢請求)的末尾處添加以下代碼:
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.aggregations.Aggregation; import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.aggregations.Aggregations; import org.elasticsearch.search.aggregations.bucket.terms.Terms; import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; 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);}}/*** 7. 設置根據分類聚合查詢* 其實就是按照分類名稱分組查詢, 目的是找到根據當前的關鍵字, 查詢出對應的分類, 并且要去除掉重復的分類* tems中傳入的是聚合組的名稱, 可以隨意起名, 但是不要重復*/TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("categoryGroup").field("categoryName");searchSourceBuilder.aggregation(termsAggregationBuilder);/*** 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);/*** 14. 獲取根據分類聚合查詢結果*/Aggregations aggregations = searchResponse.getAggregations();//將聚合結果轉換成MapMap<String, Aggregation> asMap = aggregations.getAsMap();//根據分組名稱獲取聚合的具體結果Terms terms = (Terms)asMap.get("categoryGroup");//獲取分組后集合中的具體內容List<? extends Terms.Bucket> buckets = terms.getBuckets();List<String> categoryList = new ArrayList<>();if (buckets != null) {for (Terms.Bucket bucket : buckets) {categoryList.add(bucket.getKeyAsString());}}resultMap.put("categoryList", categoryList);return resultMap;} }4測試結果
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: 排序查询
- 下一篇: WebService入门介绍