增加app端搜索球杆商品

This commit is contained in:
杨旭 2025-04-13 17:41:07 +08:00
parent 7f3934b57c
commit 3a70f3fc25
8 changed files with 292 additions and 7 deletions

View File

@ -29,6 +29,11 @@
<artifactId>tmerclub-common-rocketmq</artifactId> <artifactId>tmerclub-common-rocketmq</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency>
<groupId>com.moyuer.cloud</groupId>
<artifactId>tmerclub-common-loacl</artifactId>
<version>${project.version}</version>
</dependency>
<dependency> <dependency>
<groupId>com.moyuer.cloud</groupId> <groupId>com.moyuer.cloud</groupId>
<artifactId>tmerclub-api-product</artifactId> <artifactId>tmerclub-api-product</artifactId>

View File

@ -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);
}
}

View File

@ -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<CueProductSearchVO> getProductSearchList(SearchResponse response) {
// 1返回的所有查询到的商品
List<CueProductSearchVO> 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);
}
}

View File

@ -168,6 +168,11 @@ public interface EsConstant {
String SUPPLIER_NAME = "supplierName"; String SUPPLIER_NAME = "supplierName";
String SUPPLIER_ID = "supplierId"; String SUPPLIER_ID = "supplierId";
/**
* 球杆商品
*/
String CUE_PRODUCT_NAME = "productName";
/** /**
* 商品指定返回字段 * 商品指定返回字段
*/ */

View File

@ -1,10 +1,10 @@
package com.tmerclub.cloud.search.constant; package com.tmerclub.cloud.search.constant;
import com.tmerclub.cloud.common.constant.Constant; import com.tmerclub.cloud.common.constant.Constant;
/** /**
* es当中的index * es当中的index
*
* @author tmerclub * @author tmerclub
* @date 2020/11/12 * @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; private final String value;
public String value() {
return value;
}
EsIndexEnum(String value) { EsIndexEnum(String value) {
this.value = value; this.value = value;
} }
public String value() {
return value;
}
} }

View File

@ -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<EsPageVO<CueProductSearchVO>> searchCueProductPage(@Valid EsPageDTO pageDTO, CueProductSearchDTO cueProductSearchDTO) {
EsPageVO<CueProductSearchVO> page = localCueProductSearchManager.page(pageDTO, cueProductSearchDTO);
return ServerResponseEntity.success(page);
}
}

View File

@ -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<CueProductSearchVO>
*/
public EsPageVO<CueProductSearchVO> page(EsPageDTO pageDTO, CueProductSearchDTO cueProductSearchDTO) {
SearchResponse response = localCueProductSearchRequestBuilder.pageSearchResult(pageDTO, cueProductSearchDTO);
return buildSearchResult(pageDTO, response);
}
/**
* 构建搜索结果数据
*
* @param pageDTO 分页信息
* @param response 搜索结果
* @return EsPageVO<CueProductSearchVO>
*/
private EsPageVO<CueProductSearchVO> buildSearchResult(EsPageDTO pageDTO, SearchResponse response) {
EsPageVO<CueProductSearchVO> esPageVO = new EsPageVO<>();
// 1返回的所有查询到的商品
List<CueProductSearchVO> cueProductSearchVOS = localCueProductSearchResponseBuilder.getProductSearchList(response);
esPageVO.setList(cueProductSearchVOS);
// 2分页信息
localCueProductSearchResponseBuilder.buildSearchPage(pageDTO, esPageVO, response);
return esPageVO;
}
}

View File

@ -30,4 +30,4 @@ dubbo:
consumer: consumer:
loadbalance: dev loadbalance: dev
registry: registry:
group: dubbo-default group: dubbo-yang