当前位置:   article > 正文

es——java实现基本搜索功能_java es搜索引擎

java es搜索引擎

在输入框输入搜索关键字、点击页面过滤项、翻页、排序都会导致请求发出,查询商品信息:

 

需要实现的功能包括:

  • 关键字搜索

  • 分类、品牌、价格过滤

  • 排序

  • 分页

  • 高亮

  • 竞价排名

接口说明:

 controller层:

  1. /**
  2. * 关键字搜索,分页
  3. */
  4. @PostMapping("/list")
  5. public PageDTO<ItemDoc> list(@RequestBody RequestParams params){
  6. log.info("关键字搜索,分页===前后端联通==" + params);
  7. this.isearchService.list(params);
  8. return this.isearchService.list(params);
  9. }

service层:

  1. /**
  2. * 搜索关键字,分页
  3. */
  4. PageDTO<ItemDoc> list(RequestParams params);

service实现类:

  1. @Autowired
  2. private RestHighLevelClient client;
  3. /**
  4. * 搜索关键字,分页
  5. */
  6. @Override
  7. public PageDTO<ItemDoc> list(RequestParams params) {
  8. try {
  9. //准备Request
  10. SearchRequest request = new SearchRequest("item");
  11. //设置请求参数
  12. buildBasicQuery(params, request);
  13. //排序 sort
  14. if (!StringUtils.isBlank(params.getSortBy())) {
  15. if ("sold".equals(params.getSortBy())) {//按评价排序
  16. request.source().sort(params.getSortBy(), SortOrder.DESC);
  17. }
  18. if ("price".equals(params.getSortBy())) {//按价格排序
  19. request.source().sort(params.getSortBy(), SortOrder.ASC);
  20. }
  21. }
  22. //分页
  23. request.source().from(params.getPage() - 1).size(params.getSize());
  24. //高亮
  25. request.source().highlighter(
  26. new HighlightBuilder().field("name").requireFieldMatch(false)
  27. );
  28. //执行请求
  29. SearchResponse response = client.search(request, RequestOptions.DEFAULT);
  30. //解析结果
  31. PageDTO<ItemDoc> pageDTO = this.processResponse(response);
  32. return pageDTO;
  33. } catch (IOException e) {
  34. throw new RuntimeException(e);
  35. }
  36. }
  37. /**
  38. * 解析响应结果
  39. *
  40. * @param response
  41. */
  42. private PageDTO<ItemDoc> processResponse(SearchResponse response) {
  43. PageDTO<ItemDoc> pageDTO = new PageDTO<>();
  44. //酒店数据集合
  45. List<ItemDoc> list = new ArrayList<ItemDoc>();
  46. //解析结果
  47. SearchHits searchHits = response.getHits();
  48. //获取文档总数量
  49. TotalHits total = searchHits.getTotalHits();
  50. pageDTO.setTotal(total.value);
  51. //获取文档详情
  52. SearchHit[] hits = searchHits.getHits();
  53. for (SearchHit hit : searchHits) {
  54. //文档内容
  55. String json = hit.getSourceAsString();
  56. //将json格式转为对象
  57. ItemDoc itemDoc = JSONObject.parseObject(json, ItemDoc.class);
  58. //高亮
  59. Map<String, HighlightField> highlightFields = hit.getHighlightFields();
  60. if (!CollectionUtils.isEmpty(highlightFields)) {
  61. HighlightField highlightField = highlightFields.get("name");
  62. //高亮处理后的名称
  63. String highLightName = highlightField.getFragments()[0].string();
  64. //覆盖之前的名称
  65. itemDoc.setName(highLightName);
  66. }
  67. //将对先加入集合
  68. list.add(itemDoc);
  69. }
  70. pageDTO.setList(list);
  71. return pageDTO;
  72. }
  73. /**
  74. * 查询条件
  75. *
  76. * @param params
  77. * @param request
  78. */
  79. private void buildBasicQuery(RequestParams params, SearchRequest request) {
  80. // 1.构建BooleanQuery
  81. BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
  82. // 2.关键字搜索
  83. if (!StringUtils.isBlank(params.getKey())) {
  84. boolQuery.must(QueryBuilders.matchQuery("all", params.getKey()));
  85. } else {
  86. boolQuery.must(QueryBuilders.matchAllQuery());
  87. }
  88. //过滤
  89. //品牌
  90. if (!StringUtils.isBlank(params.getBrand())) {
  91. boolQuery.filter(QueryBuilders.termQuery("brand", params.getBrand()));
  92. }
  93. //分类
  94. if (!StringUtils.isBlank(params.getCategory())) {
  95. boolQuery.filter(QueryBuilders.termQuery("category", params.getCategory()));
  96. }
  97. //价格
  98. if (params.getMinPrice() != null && params.getMaxPrice() != null) {
  99. boolQuery.filter(QueryBuilders.rangeQuery("price").gte(params.getMinPrice()).lte(params.getMaxPrice()));
  100. }
  101. //复合查询——算分函数查询
  102. FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(
  103. boolQuery, //原始查询
  104. new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
  105. new FunctionScoreQueryBuilder.FilterFunctionBuilder(
  106. QueryBuilders.termQuery("isAD", true), //过滤条件(符合条件的文档,重新打分)
  107. ScoreFunctionBuilders.weightFactorFunction(10) //如何打分
  108. )
  109. }
  110. ).boostMode(CombineFunction.SUM);//加权规则(新旧得分运算规则)
  111. //设置整体查询
  112. request.source().query(functionScoreQueryBuilder);
  113. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/68273
推荐阅读
相关标签
  

闽ICP备14008679号