From 3a70f3fc25076a702f4fc8d192badec0d6febb13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=97=AD?= <2795210596@qq.com> Date: Sun, 13 Apr 2025 17:41:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0app=E7=AB=AF=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E7=90=83=E6=9D=86=E5=95=86=E5=93=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tmerclub-search/pom.xml | 5 + .../LocalCueProductSearchRequestBuilder.java | 99 +++++++++++++++++++ .../LocalCueProductSearchResponseBuilder.java | 64 ++++++++++++ .../cloud/search/constant/EsConstant.java | 5 + .../cloud/search/constant/EsIndexEnum.java | 17 ++-- .../app/LocalCueProductSearchController.java | 44 +++++++++ .../manager/LocalCueProductSearchManager.java | 63 ++++++++++++ .../src/main/resources/bootstrap.yml | 2 +- 8 files changed, 292 insertions(+), 7 deletions(-) create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/builder/LocalCueProductSearchRequestBuilder.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/builder/LocalCueProductSearchResponseBuilder.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/app/LocalCueProductSearchController.java create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/LocalCueProductSearchManager.java diff --git a/tmerclub-search/pom.xml b/tmerclub-search/pom.xml index 3332b49..24699e3 100644 --- a/tmerclub-search/pom.xml +++ b/tmerclub-search/pom.xml @@ -29,6 +29,11 @@ tmerclub-common-rocketmq ${project.version} + + com.moyuer.cloud + tmerclub-common-loacl + ${project.version} + com.moyuer.cloud tmerclub-api-product diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/builder/LocalCueProductSearchRequestBuilder.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/builder/LocalCueProductSearchRequestBuilder.java new file mode 100644 index 0000000..b2b7128 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/builder/LocalCueProductSearchRequestBuilder.java @@ -0,0 +1,99 @@ +package com.tmerclub.cloud.search.builder; + +import cn.hutool.core.util.ObjectUtil; +import com.tmerclub.cloud.api.dto.EsPageDTO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.constant.Constant; +import com.tmerclub.cloud.common.i18n.I18nMessage; +import com.tmerclub.cloud.common.local.dto.CueProductSearchDTO; +import com.tmerclub.cloud.common.local.vo.CueProductSearchVO; +import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO; +import com.tmerclub.cloud.common.util.Json; +import com.tmerclub.cloud.search.constant.EsConstant; +import com.tmerclub.cloud.search.constant.EsIndexEnum; +import com.tmerclub.cloud.search.util.EsSearchUtil; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.SearchHits; +import org.elasticsearch.search.aggregations.Aggregations; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * 本地生活-球杆商品搜索请求构建 + * + * @author: frank + * @create: 2025-04-13 + **/ +@Component +public class LocalCueProductSearchRequestBuilder { + + private static final Logger log = LoggerFactory.getLogger(LocalCueProductSearchRequestBuilder.class); + + /** + * 通过搜索信息分页搜索es数据的信息 + * + * @param pageDTO 分页数据 + * @param cueProductSearchDTO 商品搜索条件 + * @return 搜索结果 + */ + public SearchResponse pageSearchResult(EsPageDTO pageDTO, CueProductSearchDTO cueProductSearchDTO) { + //1、准备检索请求 + SearchRequest searchRequest = buildSearchRequest(pageDTO, cueProductSearchDTO); + return EsSearchUtil.search(searchRequest); + } + + /** + * 准备检索请求 + * + * @param pageDTO 分页参数 + * @param param 搜索参数 + * @return 搜索结果 + */ + private SearchRequest buildSearchRequest(EsPageDTO pageDTO, CueProductSearchDTO param) { + + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + Integer lang = I18nMessage.getLang(); + + // 构建bool-query + BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); + + // 关键字搜索 + keywordSearch(param, boolQueryBuilder, lang); + + searchSourceBuilder.query(boolQueryBuilder); + + // 分页 + if (Objects.nonNull(pageDTO)) { + searchSourceBuilder.from((pageDTO.getPageNum() - 1) * pageDTO.getPageSize()); + searchSourceBuilder.size(pageDTO.getPageSize()); + } + + log.info("构建的DSL语句 {}", searchSourceBuilder); + + return new SearchRequest(new String[]{EsIndexEnum.CUE_PRODUCT.value()}, searchSourceBuilder); + } + + /** + * 关键字搜索 + */ + private void keywordSearch(CueProductSearchDTO param, BoolQueryBuilder boolQueryBuilder, Integer lang) { + if (ObjectUtil.isEmpty(param.getProductName())) { + return; + } + log.error("---------------------{}", param.getProductName()); + // 创建查询语句 ES中must和should不能同时使用 同时使用should失效 嵌套多个must 将should条件拼接在一个must中即可 + BoolQueryBuilder keywordShouldQuery = QueryBuilders.boolQuery(); + keywordShouldQuery.should(QueryBuilders.wildcardQuery(EsConstant.CUE_PRODUCT_NAME, "*" + param.getProductName() + "*")); + boolQueryBuilder.must(keywordShouldQuery); + } +} diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/builder/LocalCueProductSearchResponseBuilder.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/builder/LocalCueProductSearchResponseBuilder.java new file mode 100644 index 0000000..fcf065b --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/builder/LocalCueProductSearchResponseBuilder.java @@ -0,0 +1,64 @@ +package com.tmerclub.cloud.search.builder; + +import com.tmerclub.cloud.api.dto.EsPageDTO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.local.vo.CueProductSearchVO; +import com.tmerclub.cloud.common.util.Json; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.SearchHits; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * 本地生活-球杆商品搜索结果构建 + * + * @author: frank + * @create: 2025-04-13 + **/ +@Component +public class LocalCueProductSearchResponseBuilder { + private static final Logger log = LoggerFactory.getLogger(LocalCueProductSearchResponseBuilder.class); + + + /** + * 获取搜索结果列表 + * + * @param response 搜索结果 + * @return 搜索结果列表 + */ + public List getProductSearchList(SearchResponse response) { + + // 1、返回的所有查询到的商品 + List cueProductSearchVOList = new ArrayList<>(); + //===============列表信息====================// + SearchHits hits = response.getHits(); + for (SearchHit hit : hits) { + String json = hit.getSourceAsString(); + CueProductSearchVO cueProductSearchVO = Json.parseObject(json, CueProductSearchVO.class); + cueProductSearchVOList.add(cueProductSearchVO); + } + return cueProductSearchVOList; + } + + /** + * 构建分页数据 + * + * @param pageDTO 分页参数 + * @param esPageVO 分页返回对象 + * @param response 搜索结果 + */ + public void buildSearchPage(EsPageDTO pageDTO, EsPageVO esPageVO, SearchResponse response) { + //总记录数 + long total = response.getHits().getTotalHits().value; + esPageVO.setTotal(total); + // 总页码 + int totalPages = (int) total % pageDTO.getPageSize() == 0 ? + (int) total / pageDTO.getPageSize() : ((int) total / pageDTO.getPageSize() + 1); + esPageVO.setPages(totalPages); + } +} \ No newline at end of file diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsConstant.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsConstant.java index 6a4cab9..cc2f27c 100644 --- a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsConstant.java +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsConstant.java @@ -168,6 +168,11 @@ public interface EsConstant { String SUPPLIER_NAME = "supplierName"; String SUPPLIER_ID = "supplierId"; + /** + * 球杆商品 + */ + String CUE_PRODUCT_NAME = "productName"; + /** * 商品指定返回字段 */ diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsIndexEnum.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsIndexEnum.java index c8a4e3f..5a04f57 100644 --- a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsIndexEnum.java +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsIndexEnum.java @@ -1,10 +1,10 @@ - package com.tmerclub.cloud.search.constant; import com.tmerclub.cloud.common.constant.Constant; /** * es当中的index + * * @author tmerclub * @date 2020/11/12 */ @@ -38,16 +38,21 @@ public enum EsIndexEnum { /** * 调拨订单 */ - ALLOT_ORDER(Constant.NAME_SPACE + "allot-order") + ALLOT_ORDER(Constant.NAME_SPACE + "allot-order"), + + /** + * 球杆商品 + */ + CUE_PRODUCT(Constant.NAME_SPACE + "cue_product"), ; private final String value; - public String value() { - return value; - } - EsIndexEnum(String value) { this.value = value; } + + public String value() { + return value; + } } diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/app/LocalCueProductSearchController.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/app/LocalCueProductSearchController.java new file mode 100644 index 0000000..b5ab752 --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/app/LocalCueProductSearchController.java @@ -0,0 +1,44 @@ +package com.tmerclub.cloud.search.controller.app; + +import com.tmerclub.cloud.api.dto.EsPageDTO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.local.dto.CueProductSearchDTO; +import com.tmerclub.cloud.common.local.vo.CueProductSearchVO; +import com.tmerclub.cloud.common.response.ServerResponseEntity; +import com.tmerclub.cloud.search.manager.LocalCueProductSearchManager; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 本地生活-球杆商品搜索 + * + * @author: frank + * @create: 2025-04-12 + **/ +@Tag(name = "本地生活-球杆商品搜索") +@RestController("localCueProductSearchController") +@RequestMapping("/ua/cueProductSearch") +public class LocalCueProductSearchController { + + @Resource + LocalCueProductSearchManager localCueProductSearchManager; + + /** + * APP端搜索球杆商品接口 + * + * @param pageDTO 分页参数 + * @param cueProductSearchDTO 搜索参数 + * @return 分页结果集 + */ + @GetMapping("/searchCueProductPage") + @Operation(summary = "APP端搜索球杆商品接口", description = "APP端搜索球杆商品接口") + public ServerResponseEntity> searchCueProductPage(@Valid EsPageDTO pageDTO, CueProductSearchDTO cueProductSearchDTO) { + EsPageVO page = localCueProductSearchManager.page(pageDTO, cueProductSearchDTO); + return ServerResponseEntity.success(page); + } +} \ No newline at end of file diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/LocalCueProductSearchManager.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/LocalCueProductSearchManager.java new file mode 100644 index 0000000..47ae41d --- /dev/null +++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/LocalCueProductSearchManager.java @@ -0,0 +1,63 @@ +package com.tmerclub.cloud.search.manager; + +import com.tmerclub.cloud.api.dto.EsPageDTO; +import com.tmerclub.cloud.api.vo.EsPageVO; +import com.tmerclub.cloud.common.local.dto.CueProductSearchDTO; +import com.tmerclub.cloud.common.local.vo.CueProductSearchVO; +import com.tmerclub.cloud.search.builder.LocalCueProductSearchRequestBuilder; +import com.tmerclub.cloud.search.builder.LocalCueProductSearchResponseBuilder; +import jakarta.annotation.Resource; +import org.elasticsearch.action.search.SearchResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 本地生活-球杆商品搜索 + * + * @author: frank + * @create: 2025-04-13 + **/ +@Component +public class LocalCueProductSearchManager { + private static final Logger log = LoggerFactory.getLogger(LocalCueProductSearchManager.class); + + @Resource + LocalCueProductSearchRequestBuilder localCueProductSearchRequestBuilder; + @Resource + LocalCueProductSearchResponseBuilder localCueProductSearchResponseBuilder; + + /** + * 分页搜索 + * + * @param pageDTO 分页信息 + * @param cueProductSearchDTO 搜索条件 + * @return EsPageVO + */ + public EsPageVO page(EsPageDTO pageDTO, CueProductSearchDTO cueProductSearchDTO) { + SearchResponse response = localCueProductSearchRequestBuilder.pageSearchResult(pageDTO, cueProductSearchDTO); + return buildSearchResult(pageDTO, response); + } + + + /** + * 构建搜索结果数据 + * + * @param pageDTO 分页信息 + * @param response 搜索结果 + * @return EsPageVO + */ + private EsPageVO buildSearchResult(EsPageDTO pageDTO, SearchResponse response) { + EsPageVO esPageVO = new EsPageVO<>(); + + // 1、返回的所有查询到的商品 + List cueProductSearchVOS = localCueProductSearchResponseBuilder.getProductSearchList(response); + esPageVO.setList(cueProductSearchVOS); + + // 2、分页信息 + localCueProductSearchResponseBuilder.buildSearchPage(pageDTO, esPageVO, response); + return esPageVO; + } +} diff --git a/tmerclub-search/src/main/resources/bootstrap.yml b/tmerclub-search/src/main/resources/bootstrap.yml index 13527b8..396c345 100644 --- a/tmerclub-search/src/main/resources/bootstrap.yml +++ b/tmerclub-search/src/main/resources/bootstrap.yml @@ -30,4 +30,4 @@ dubbo: consumer: loadbalance: dev registry: - group: dubbo-default + group: dubbo-yang