当前位置:   article > 正文

谷粒商城 es的检索运用,searchrequest的构建

searchrequest

1.使用javaApi接口创建searchrequest:

  1. /**
  2. * 构建检索请求:
  3. * #模糊匹配,过滤(按照属性,分类,品牌,价格区间,库存),排序,分页,高亮,聚合分析
  4. * */
  5. private SearchRequest buildSearchRequest(SearchParam searchParam) {
  6. SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();//构建DSL语句
  7. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  8. /**
  9. * 模糊匹配,过滤(按照属性,分类,品牌,价格区间,库存)
  10. * */
  11. //1.构建bool-query
  12. //1.1 模糊匹配 bool - must
  13. if (!StringUtils.isEmpty(searchParam.getKeyWord())){
  14. boolQueryBuilder.must(QueryBuilders.matchQuery("skuTitle",searchParam.getKeyWord()));
  15. }
  16. //1.2 bool - filter 按照三级分类id查询
  17. if (searchParam.getCatalog3Id()!=null){
  18. boolQueryBuilder.filter(QueryBuilders.termQuery("catalogId",searchParam.getCatalog3Id()));
  19. }
  20. //1.3 bool -filter 按照品牌id查询
  21. if (searchParam.getBrandId()!=null&&searchParam.getBrandId().size()>0){
  22. boolQueryBuilder.filter(QueryBuilders.termsQuery("brandId",searchParam.getBrandId()));
  23. }
  24. //1.4 bool -filter - nested 按照指定的属性查询
  25. if (searchParam.getAttrs()!=null&&searchParam.getAttrs().size()>0){
  26. //每一个属性查询必须都得生成一个nested查询
  27. for (String attr : searchParam.getAttrs()) {
  28. BoolQueryBuilder nestedBoolQuery = QueryBuilders.boolQuery();
  29. //attrs=1_5寸:8&attrs=2_16G:8G
  30. String[] attrSplit = attr.split("_");
  31. String attrId = attrSplit[0];
  32. String[] attrValues = attrSplit[1].split(":");
  33. nestedBoolQuery.must(QueryBuilders.termQuery("attrs.attrId",attrId));
  34. nestedBoolQuery.must(QueryBuilders.termsQuery("attrs.attrValue",attrValues));
  35. //每一个必须都得生成一个nested查询
  36. NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery("attrs", nestedBoolQuery, ScoreMode.None);
  37. boolQueryBuilder.filter(nestedQuery);
  38. }
  39. }
  40. //1.5 bool -filter 是否有库存查询
  41. if (searchParam.getHasStock()==null){
  42. //如果没有传输是否有库存这个参数,默认查找有库存的
  43. boolQueryBuilder.filter(QueryBuilders.termQuery("hasStock",true));
  44. }else {
  45. boolQueryBuilder.filter(QueryBuilders.termQuery("hasStock",searchParam.getHasStock()==1));
  46. }
  47. //1.6按照价格区间
  48. if (!StringUtils.isEmpty(searchParam.getSkuPrice())){
  49. RangeQueryBuilder skuPriceRangeQuery = QueryBuilders.rangeQuery("skuPrice");
  50. String[] s = searchParam.getSkuPrice().split("_");
  51. if (s.length == 2 ){
  52. //区间
  53. skuPriceRangeQuery.gte(s[0]).lte(s[1]);
  54. }else if (s.length==1){
  55. if (searchParam.getSkuPrice().startsWith("_")){
  56. skuPriceRangeQuery.lte(s[0]);
  57. }
  58. if (searchParam.getSkuPrice().endsWith("_")){
  59. skuPriceRangeQuery.gte(s[0]);
  60. }
  61. }
  62. boolQueryBuilder.filter(skuPriceRangeQuery);
  63. }
  64. searchSourceBuilder.query(boolQueryBuilder);
  65. /**
  66. * 排序,分页,
  67. * sort=saleCount_asc/desc
  68. * sort=skuPrice_asc/desc
  69. * sort= hotScore_asc/desc
  70. * */
  71. if (!StringUtils.isEmpty(searchParam.getSort())){
  72. String sort = searchParam.getSort();
  73. String[] sortSplit = sort.split("_");
  74. SortOrder sortOrder = sortSplit[1].equalsIgnoreCase("asc")?SortOrder.ASC:SortOrder.DESC;
  75. searchSourceBuilder.sort(sortSplit[0],sortOrder);
  76. }
  77. //分页
  78. if (searchParam.getPageNum()==null){
  79. //如果没有传输pagenum参数,默认为第一页
  80. searchSourceBuilder.from(((1-1)*EsConstant.PRODUCT_PAGESIZE));
  81. searchSourceBuilder.size(EsConstant.PRODUCT_PAGESIZE);
  82. }else {
  83. searchSourceBuilder.from((searchParam.getPageNum()-1)*EsConstant.PRODUCT_PAGESIZE);
  84. searchSourceBuilder.size(EsConstant.PRODUCT_PAGESIZE);
  85. }
  86. /**
  87. * 高亮
  88. * */
  89. if (!StringUtils.isEmpty(searchParam.getKeyWord())){
  90. HighlightBuilder highlightBuilder=new HighlightBuilder();
  91. highlightBuilder.field("skuTitle");
  92. highlightBuilder.preTags("<b style= 'color:red'>");
  93. highlightBuilder.postTags("</b>");
  94. searchSourceBuilder.highlighter(highlightBuilder);
  95. }
  96. /**
  97. * 聚合分析
  98. * */
  99. //1.品牌的聚合
  100. TermsAggregationBuilder brand_agg = AggregationBuilders.terms("brand_agg");
  101. brand_agg.field("brandId");
  102. //品牌的子聚合
  103. brand_agg.subAggregation(AggregationBuilders.terms("brand_name_agg").field("brandName").size(1));
  104. brand_agg.subAggregation(AggregationBuilders.terms("brand_img_agg").field("brandImg").size(1));
  105. //TODO 1. 品牌的聚合
  106. searchSourceBuilder.aggregation(brand_agg);
  107. //2.分类聚合 catalog_agg
  108. TermsAggregationBuilder catalog_agg = AggregationBuilders.terms("catalog_agg").field("catalogId").size(20);
  109. catalog_agg.subAggregation(AggregationBuilders.terms("catalog_name_agg").field("catalogName").size(1));
  110. //TODO 2. 分类的聚合
  111. searchSourceBuilder.aggregation(catalog_agg);
  112. //3.属性聚合 attr_agg
  113. NestedAggregationBuilder attr_agg = AggregationBuilders.nested("attr_agg", "attrs");
  114. //3.1聚合当前所有的attrId
  115. TermsAggregationBuilder attr_id_agg = AggregationBuilders.terms("attr_id_agg").field("attrs.attrId").size(10);
  116. //3.2聚合分析出当前attr_id对应的名字
  117. attr_id_agg.subAggregation(AggregationBuilders.terms("attr_name_agg").field("attrs.attrName").size(1));
  118. //3.3聚合分析出当前attr_id对应的所有可能的属性值attrValue
  119. attr_id_agg.subAggregation(AggregationBuilders.terms("attr_value_agg").field("attrs.attrValue").size(50));
  120. attr_agg.subAggregation(attr_id_agg);
  121. //TODO 3. 属性的聚合
  122. searchSourceBuilder.aggregation(attr_agg);
  123. //打印构造的DSL
  124. String s = searchSourceBuilder.toString();
  125. System.out.println("构建的DSL:"+s);
  126. SearchRequest searchRequest = new SearchRequest(new String[]{EsConstant.PRODUCT_INDEX}, searchSourceBuilder);
  127. return searchRequest;
  128. }

2.传递过来的参数:

http://localhost:12000/list.html?keyWord=HUAWEI&catalog3Id=225&attrs=11_第一代骁龙8&skuPrice=4000_

3.使用postman发送形成的DSL语句:

  1. GET product/_search
  2. {
  3. "from": 0,
  4. "size": 5,
  5. "query": {
  6. "bool": {
  7. "must": [
  8. {
  9. "match": {
  10. "skuTitle": {
  11. "query": "HUAWEI",
  12. "operator": "OR",
  13. "prefix_length": 0,
  14. "max_expansions": 50,
  15. "fuzzy_transpositions": true,
  16. "lenient": false,
  17. "zero_terms_query": "NONE",
  18. "auto_generate_synonyms_phrase_query": true,
  19. "boost": 1.0
  20. }
  21. }
  22. }
  23. ],
  24. "filter": [
  25. {
  26. "term": {
  27. "catalogId": {
  28. "value": 225,
  29. "boost": 1.0
  30. }
  31. }
  32. },
  33. {
  34. "nested": {
  35. "query": {
  36. "bool": {
  37. "must": [
  38. {
  39. "term": {
  40. "attrs.attrId": {
  41. "value": "11",
  42. "boost": 1.0
  43. }
  44. }
  45. },
  46. {
  47. "terms": {
  48. "attrs.attrValue": [
  49. "第一代骁龙8"
  50. ],
  51. "boost": 1.0
  52. }
  53. }
  54. ],
  55. "adjust_pure_negative": true,
  56. "boost": 1.0
  57. }
  58. },
  59. "path": "attrs",
  60. "ignore_unmapped": false,
  61. "score_mode": "none",
  62. "boost": 1.0
  63. }
  64. },
  65. {
  66. "term": {
  67. "hasStock": {
  68. "value": true,
  69. "boost": 1.0
  70. }
  71. }
  72. },
  73. {
  74. "range": {
  75. "skuPrice": {
  76. "from": "4000",
  77. "to": null,
  78. "include_lower": true,
  79. "include_upper": true,
  80. "boost": 1.0
  81. }
  82. }
  83. }
  84. ],
  85. "adjust_pure_negative": true,
  86. "boost": 1.0
  87. }
  88. },
  89. "aggregations": {
  90. "brand_agg": {
  91. "terms": {
  92. "field": "brandId",
  93. "size": 10,
  94. "min_doc_count": 1,
  95. "shard_min_doc_count": 0,
  96. "show_term_doc_count_error": false,
  97. "order": [
  98. {
  99. "_count": "desc"
  100. },
  101. {
  102. "_key": "asc"
  103. }
  104. ]
  105. },
  106. "aggregations": {
  107. "brand_name_agg": {
  108. "terms": {
  109. "field": "brandName",
  110. "size": 1,
  111. "min_doc_count": 1,
  112. "shard_min_doc_count": 0,
  113. "show_term_doc_count_error": false,
  114. "order": [
  115. {
  116. "_count": "desc"
  117. },
  118. {
  119. "_key": "asc"
  120. }
  121. ]
  122. }
  123. },
  124. "brand_img_agg": {
  125. "terms": {
  126. "field": "brandImg",
  127. "size": 1,
  128. "min_doc_count": 1,
  129. "shard_min_doc_count": 0,
  130. "show_term_doc_count_error": false,
  131. "order": [
  132. {
  133. "_count": "desc"
  134. },
  135. {
  136. "_key": "asc"
  137. }
  138. ]
  139. }
  140. }
  141. }
  142. },
  143. "catalog_agg": {
  144. "terms": {
  145. "field": "catalogId",
  146. "size": 20,
  147. "min_doc_count": 1,
  148. "shard_min_doc_count": 0,
  149. "show_term_doc_count_error": false,
  150. "order": [
  151. {
  152. "_count": "desc"
  153. },
  154. {
  155. "_key": "asc"
  156. }
  157. ]
  158. },
  159. "aggregations": {
  160. "catalog_name_agg": {
  161. "terms": {
  162. "field": "catalogName",
  163. "size": 1,
  164. "min_doc_count": 1,
  165. "shard_min_doc_count": 0,
  166. "show_term_doc_count_error": false,
  167. "order": [
  168. {
  169. "_count": "desc"
  170. },
  171. {
  172. "_key": "asc"
  173. }
  174. ]
  175. }
  176. }
  177. }
  178. },
  179. "attr_agg": {
  180. "nested": {
  181. "path": "attrs"
  182. },
  183. "aggregations": {
  184. "attr_id_agg": {
  185. "terms": {
  186. "field": "attrs.attrId",
  187. "size": 10,
  188. "min_doc_count": 1,
  189. "shard_min_doc_count": 0,
  190. "show_term_doc_count_error": false,
  191. "order": [
  192. {
  193. "_count": "desc"
  194. },
  195. {
  196. "_key": "asc"
  197. }
  198. ]
  199. },
  200. "aggregations": {
  201. "attr_name_agg": {
  202. "terms": {
  203. "field": "attrs.attrName",
  204. "size": 1,
  205. "min_doc_count": 1,
  206. "shard_min_doc_count": 0,
  207. "show_term_doc_count_error": false,
  208. "order": [
  209. {
  210. "_count": "desc"
  211. },
  212. {
  213. "_key": "asc"
  214. }
  215. ]
  216. }
  217. },
  218. "attr_value_agg": {
  219. "terms": {
  220. "field": "attrs.attrValue",
  221. "size": 50,
  222. "min_doc_count": 1,
  223. "shard_min_doc_count": 0,
  224. "show_term_doc_count_error": false,
  225. "order": [
  226. {
  227. "_count": "desc"
  228. },
  229. {
  230. "_key": "asc"
  231. }
  232. ]
  233. }
  234. }
  235. }
  236. }
  237. }
  238. }
  239. },
  240. "highlight": {
  241. "pre_tags": [
  242. "<b style= 'color:red'>"
  243. ],
  244. "post_tags": [
  245. "</b>"
  246. ],
  247. "fields": {
  248. "skuTitle": {}
  249. }
  250. }
  251. }

4.查询到的结果:

  1. {
  2. "took" : 5,
  3. "timed_out" : false,
  4. "_shards" : {
  5. "total" : 1,
  6. "successful" : 1,
  7. "skipped" : 0,
  8. "failed" : 0
  9. },
  10. "hits" : {
  11. "total" : {
  12. "value" : 1,
  13. "relation" : "eq"
  14. },
  15. "max_score" : 0.66301036,
  16. "hits" : [
  17. {
  18. "_index" : "product",
  19. "_type" : "_doc",
  20. "_id" : "7",
  21. "_score" : 0.66301036,
  22. "_source" : {
  23. "attrs" : [
  24. {
  25. "attrId" : 11,
  26. "attrName" : "CPU型号",
  27. "attrValue" : "第一代骁龙8"
  28. }
  29. ],
  30. "brandId" : 4,
  31. "brandImg" : "https://gulimall-nan1.oss-cn-beijing.aliyuncs.com/2022-11-30/90b15473-072f-42d4-8c35-11a6cd1161ac_huawei.png",
  32. "brandName" : "华为",
  33. "catalogId" : 225,
  34. "catalogName" : "手机",
  35. "hasStock" : true,
  36. "hotScore" : 0,
  37. "saleCount" : 0,
  38. "skuId" : 7,
  39. "skuImg" : "https://gulimall-nan1.oss-cn-beijing.aliyuncs.com/2022-12-05//ff79ccd7-f380-4805-86aa-17624e2f59e3_d511faab82abb34b.jpg",
  40. "skuPrice" : 4999.0,
  41. "skuTitle" : "HUAWEI Mate 50 冰霜银 8+128GB直屏旗舰 超光变XMAGE影像 北斗卫星消息 低电量应急模式",
  42. "spuId" : 15
  43. },
  44. "highlight" : {
  45. "skuTitle" : [
  46. "<b style= 'color:red'>HUAWEI</b> Mate 50 冰霜银 8+128GB直屏旗舰 超光变XMAGE影像 北斗卫星消息 低电量应急模式"
  47. ]
  48. }
  49. }
  50. ]
  51. },
  52. "aggregations" : {
  53. "catalog_agg" : {
  54. "doc_count_error_upper_bound" : 0,
  55. "sum_other_doc_count" : 0,
  56. "buckets" : [
  57. {
  58. "key" : 225,
  59. "doc_count" : 1,
  60. "catalog_name_agg" : {
  61. "doc_count_error_upper_bound" : 0,
  62. "sum_other_doc_count" : 0,
  63. "buckets" : [
  64. {
  65. "key" : "手机",
  66. "doc_count" : 1
  67. }
  68. ]
  69. }
  70. }
  71. ]
  72. },
  73. "attr_agg" : {
  74. "doc_count" : 1,
  75. "attr_id_agg" : {
  76. "doc_count_error_upper_bound" : 0,
  77. "sum_other_doc_count" : 0,
  78. "buckets" : [
  79. {
  80. "key" : 11,
  81. "doc_count" : 1,
  82. "attr_name_agg" : {
  83. "doc_count_error_upper_bound" : 0,
  84. "sum_other_doc_count" : 0,
  85. "buckets" : [
  86. {
  87. "key" : "CPU型号",
  88. "doc_count" : 1
  89. }
  90. ]
  91. },
  92. "attr_value_agg" : {
  93. "doc_count_error_upper_bound" : 0,
  94. "sum_other_doc_count" : 0,
  95. "buckets" : [
  96. {
  97. "key" : "第一代骁龙8",
  98. "doc_count" : 1
  99. }
  100. ]
  101. }
  102. }
  103. ]
  104. }
  105. },
  106. "brand_agg" : {
  107. "doc_count_error_upper_bound" : 0,
  108. "sum_other_doc_count" : 0,
  109. "buckets" : [
  110. {
  111. "key" : 4,
  112. "doc_count" : 1,
  113. "brand_img_agg" : {
  114. "doc_count_error_upper_bound" : 0,
  115. "sum_other_doc_count" : 0,
  116. "buckets" : [
  117. {
  118. "key" : "https://gulimall-nan1.oss-cn-beijing.aliyuncs.com/2022-11-30/90b15473-072f-42d4-8c35-11a6cd1161ac_huawei.png",
  119. "doc_count" : 1
  120. }
  121. ]
  122. },
  123. "brand_name_agg" : {
  124. "doc_count_error_upper_bound" : 0,
  125. "sum_other_doc_count" : 0,
  126. "buckets" : [
  127. {
  128. "key" : "华为",
  129. "doc_count" : 1
  130. }
  131. ]
  132. }
  133. }
  134. ]
  135. }
  136. }
  137. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/842380
推荐阅读
相关标签
  

闽ICP备14008679号