ElasticSearch排序/分页查询

£神魔★判官ぃ 2022-04-02 19:46 583阅读 0赞
  1. package com.czxy.service;
  2. import com.czxy.dao.SkuRepository;
  3. import com.czxy.vo.*;
  4. import org.elasticsearch.index.query.BoolQueryBuilder;
  5. import org.elasticsearch.index.query.QueryBuilders;
  6. import org.elasticsearch.search.sort.SortBuilders;
  7. import org.elasticsearch.search.sort.SortOrder;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.data.domain.Page;
  10. import org.springframework.data.domain.PageRequest;
  11. import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
  12. import org.springframework.stereotype.Service;
  13. import org.springframework.transaction.annotation.Transactional;
  14. import java.util.ArrayList;
  15. import java.util.HashMap;
  16. import java.util.Set;
  17. /** * @author * @create 2018-12-25 18:32 * @desc 条件查询 */
  18. @Service
  19. @Transactional
  20. public class SkuSearchService {
  21. /** *@author *@create 2018/12/26 *@desc dao层 用来执行查询 */
  22. @Autowired
  23. private SkuRepository skuRepository;
  24. /** *@author *@create 2018/12/26 16:12 *@Param [skuSearchRequest] *@return org.springframework.http.ResponseEntity<java.lang.Object> *@desc 条件查询 商品 */
  25. public SearchResult search(SkuSearchRequest req) {
  26. //如果三级分类为空
  27. if(req.getCatid()==null){
  28. SearchResult br = new SearchResult();
  29. br.setErrno(1);
  30. br.setErrmsg("没有数据");
  31. return br;
  32. }
  33. //1 创建查询构建器s
  34. NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
  35. //2. 多条件查询 使用boolQuery 可以new 但是可以使用静态 建议使用静态
  36. BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
  37. // 3. cat3id 分类 不分词匹配(整数)
  38. boolQuery.must(QueryBuilders.termQuery("cat3_id",req.getCatid()));
  39. // 4.品牌 不分词匹配(整数)
  40. if(req.getBrand_id()!=null&&!"".equals(req.getBrand_id())) {
  41. boolQuery.must(QueryBuilders.termQuery("brand_id", req.getBrand_id()));
  42. }
  43. // 5.规格
  44. HashMap<String,String> map=null;
  45. //先判断规格是否为null
  46. if(req.getSpec_list()!=null&&!"".equals(req.getSpec_list())){
  47. //不为null 进行排序
  48. map=new HashMap<String,String>();
  49. //进行切割 存入map 机身颜色=金色,内存=4GB,机身颜色=
  50. String[] specList = req.getSpec_list().split(",");
  51. for (String s : specList) {
  52. //进行二次分割 机身颜色=金色
  53. String[] split = s.split("=");
  54. //是否 第二个参数为空 机身颜色=
  55. if(split.length==1){
  56. //删除相对已有的
  57. map.remove(split[0]);
  58. }else{
  59. //存入map key:机身颜色 value:金色
  60. map.put(split[0],split[1]);
  61. }
  62. }
  63. if(map!=null){
  64. //第一种遍历方式
  65. // Set<Map.Entry<String, String>> entries = map.entrySet();
  66. // for (Map.Entry<String, String> entry : entries) {
  67. // entry.getKey()
  68. // entry.getValue()
  69. // }
  70. //遍历map
  71. Set<String> set = map.keySet();
  72. for (String key : set) {
  73. //value
  74. String value=map.get(key);
  75. //组装key
  76. //在es中 specs.机身颜色.keyword =红色
  77. key="specs."+key+".keyword";
  78. //搜索 es中的map
  79. boolQuery.must(QueryBuilders.termQuery(key,value));
  80. }
  81. }
  82. }
  83. // 6 最低价格
  84. if(req.getMin_price()!=null){
  85. //支持单个查询 大于等于 最低价格
  86. boolQuery.must(QueryBuilders.rangeQuery("price").gte(req.getMin_price()));
  87. }
  88. // 7 最高价格
  89. if(req.getMax_price()!=null){
  90. //支持单个查询 小于等于最高价格
  91. boolQuery.must(QueryBuilders.rangeQuery("price").lte(req.getMax_price()));
  92. }
  93. // 8 排序字段
  94. if(req.getSort_by()!=null) {
  95. //销量排序 默认降序
  96. if (req.getSort_by().equals("xl")) {
  97. queryBuilder.withSort(SortBuilders.fieldSort("seller_count").order(SortOrder.DESC));
  98. }
  99. //价格排序
  100. else if (req.getSort_by().equals("jg")) {
  101. //降序情况
  102. if (req.getSort_way().equalsIgnoreCase("desc")) {
  103. queryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC));
  104. } else {
  105. //升序情况
  106. queryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.ASC));
  107. }
  108. }
  109. //评论 默认降序
  110. else if (req.getSort_by().equals("pl")) {
  111. queryBuilder.withSort(SortBuilders.fieldSort("comment_count").order(SortOrder.DESC));
  112. }
  113. //上架时间 默认降序
  114. else if (req.getSort_by().equals("sj")) {
  115. queryBuilder.withSort(SortBuilders.fieldSort("on_sale_time").order(SortOrder.DESC));
  116. }
  117. }
  118. // 9 分页 为什么页数要减一,因为elasticsearch 页数从0开始
  119. queryBuilder.withPageable(PageRequest.of((req.getPage()-1),req.getLimit()));
  120. // 10 queryBuilder 管理 boolQuery
  121. queryBuilder.withQuery(boolQuery);
  122. //执行查询
  123. Page<SearchSku> page = this.skuRepository.search(queryBuilder.build());
  124. long count = page.getTotalElements();
  125. //准备返回data
  126. ArrayList<ReturnSku> list = new ArrayList<>();
  127. for (SearchSku s : page) {
  128. ReturnSku sku = new ReturnSku();
  129. sku.setId(s.getId());
  130. sku.setGoods_name(s.getSku_name());
  131. sku.setPrice(s.getPrice());
  132. sku.setMidlogo(s.getLogo());
  133. sku.setComment_count(s.getComment_count());
  134. list.add(sku);
  135. }
  136. //准备返回
  137. SearchResult result = new SearchResult(0,"成功",list,(int)count,req.getCatid());
  138. return result;
  139. }
  140. }

发表评论

表情:
评论列表 (有 0 条评论,583人围观)

还没有评论,来说两句吧...

相关阅读