From 095c52c6ec7882ce11177178b49d33e6c886af61 Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期一, 17 十一月 2025 15:02:38 +0800
Subject: [PATCH] 添加已完成标识
---
framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java | 83 ++++++++++++++++++++++++++++++++++++++---
1 files changed, 77 insertions(+), 6 deletions(-)
diff --git a/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java b/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java
index f752e4c..b860033 100644
--- a/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java
@@ -3,12 +3,15 @@
import cn.hutool.core.convert.Convert;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.ArrayUtil;
+import cn.lili.base.Result;
import cn.lili.cache.Cache;
import cn.lili.cache.CachePrefix;
import cn.lili.common.exception.ServiceException;
+import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.goods.entity.enums.GoodsAuthEnum;
import cn.lili.modules.goods.entity.enums.GoodsStatusEnum;
+import cn.lili.modules.lmk.domain.query.VideoGoodsEsQuery;
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
import cn.lili.modules.search.entity.dos.EsGoodsRelatedInfo;
import cn.lili.modules.search.entity.dto.EsGoodsSearchDTO;
@@ -29,6 +32,7 @@
import org.elasticsearch.index.query.functionscore.FieldValueFactorFunctionBuilder;
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;
+import org.elasticsearch.index.search.MultiMatchQuery;
import org.elasticsearch.search.aggregations.*;
import org.elasticsearch.search.aggregations.bucket.nested.ParsedNested;
import org.elasticsearch.search.aggregations.bucket.terms.ParsedStringTerms;
@@ -38,11 +42,16 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.*;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
@@ -88,10 +97,15 @@
cache.incrementScore(CachePrefix.HOT_WORD.getPrefix(), searchDTO.getKeyword());
}
NativeSearchQueryBuilder searchQueryBuilder = createSearchQueryBuilder(searchDTO, pageVo);
-// searchQueryBuilder.withCollapseField("goodsId.keyword");
+ if (Objects.nonNull(searchDTO.getCanFilter()) && searchDTO.getCanFilter()) {
+ // 浣跨敤sn瀛楁鎺掑簭骞跺湪鎶樺彔鏃堕�夋嫨sn鏈�灏忕殑璁板綍
+ searchQueryBuilder.withCollapseField("goodsId.keyword");
+ searchQueryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.ASC));
+ }
NativeSearchQuery searchQuery = searchQueryBuilder.build();
searchQuery.setTrackTotalHits(true);
- log.debug("searchGoods DSL:{}", searchQuery.getQuery());
+ log.info("searchGoods DSL:{}", searchQuery.getQuery().toString());
+ log.info("searchGoods sort:{}", searchQuery.getElasticsearchSorts().toString());
SearchHits<EsGoodsIndex> search = restTemplate.search(searchQuery, EsGoodsIndex.class);
return SearchHitSupport.searchPageFor(search, searchQuery.getPageable());
}
@@ -174,6 +188,38 @@
@Override
public EsGoodsIndex getEsGoodsById(String id) {
return this.restTemplate.get(id, EsGoodsIndex.class);
+ }
+
+ @Override
+ public Result videoGoodsEsPage(VideoGoodsEsQuery q) {
+ // 鍒ゆ柇鍟嗗搧绱㈠紩鏄惁瀛樺湪
+ if (!restTemplate.indexOps(EsGoodsIndex.class).exists()) {
+ return Result.ok();
+ }
+ // 鏍规嵁閿�閲忓�掑簭鎺掑垪
+ Pageable pageable = PageRequest.of(q.getPageNumber(), q.getPageSize(), Sort.by("buyCount").descending());
+
+ NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
+ queryBuilder.withPageable(pageable);
+
+ BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
+
+ // 鍏抽敭璇嶅尮閰嶅晢鍝佸悕绉般�佸晢鍝佺紪鍙�
+ if (!StringUtils.isEmpty(q.getKeyword())) {
+ boolQuery.must(QueryBuilders.multiMatchQuery(q.getKeyword(), "goodsName", "sn"));
+ }
+
+ if (q.getSearchFromSelfStore()) {
+ // 濡傛灉鍙煡鑷搴楅摵鍟嗗搧
+ boolQuery.must(QueryBuilders.termQuery("storeId", UserContext.getCurrentUser().getStoreId()));
+ }
+
+ queryBuilder.withQuery(boolQuery);
+
+ NativeSearchQuery query = queryBuilder.build();
+ SearchHits<EsGoodsIndex> searchHits = restTemplate.search(query, EsGoodsIndex.class);
+ List<EsGoodsIndex> data = searchHits.stream().map(hit -> hit.getContent()).collect(Collectors.toList());
+ return Result.ok().data(data).total(searchHits.getTotalHits());
}
/**
@@ -411,8 +457,16 @@
FunctionScoreQueryBuilder.FilterFunctionBuilder[] builders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[filterFunctionBuilders.size()];
filterFunctionBuilders.toArray(builders);
FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(QueryBuilders.matchAllQuery(), builders)
- .scoreMode(FunctionScoreQuery.ScoreMode.SUM)
- .setMinScore(2);
+ .scoreMode(FunctionScoreQuery.ScoreMode.SUM);
+ functionScoreQueryBuilder.setMinScore(0);
+// if (CharSequenceUtil.isNotEmpty(searchDTO.getPromotionsId()) && CharSequenceUtil.isNotEmpty(searchDTO.getPromotionType())) {
+// functionScoreQueryBuilder.setMinScore(0);
+// }else if (cn.lili.common.utils.StringUtils.isNotBlank(searchDTO.getCategoryId())){
+// functionScoreQueryBuilder.setMinScore(0);
+// }
+// else {
+// functionScoreQueryBuilder.setMinScore(2);
+// }
//鑱氬悎鎼滅储鍒欏皢缁撴灉鏀惧叆杩囨护鏉′欢
filterBuilder.must(functionScoreQueryBuilder);
} else {
@@ -425,7 +479,7 @@
if (pageVo != null && CharSequenceUtil.isNotEmpty(pageVo.getOrder()) && CharSequenceUtil.isNotEmpty(pageVo.getSort())) {
- nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort(pageVo.getSort()).order(SortOrder.valueOf(pageVo.getOrder().toUpperCase())));
+ nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort(pageVo.getSort()).order(SortOrder.valueOf(pageVo.getOrder().toUpperCase())).missing("_last"));
} else {
nativeSearchQueryBuilder.withSort(SortBuilders.scoreSort().order(SortOrder.DESC));
}
@@ -518,6 +572,23 @@
if (CharSequenceUtil.isNotEmpty(searchDTO.getPromotionsId()) && CharSequenceUtil.isNotEmpty(searchDTO.getPromotionType())) {
filterBuilder.must(QueryBuilders.wildcardQuery("promotionMapJson", "*" + searchDTO.getPromotionType() + "-" + searchDTO.getPromotionsId() + "*"));
}
+
+ if (Objects.nonNull(searchDTO.getNeedFilterPre()) && searchDTO.getNeedFilterPre()) {
+ // 杞崲涓哄綋澶� 00:00:00 鐨勬椂闂存埑锛堟绉掞級
+ long time = LocalDate.now().atStartOfDay(ZoneId.systemDefault())
+ .toInstant()
+ .toEpochMilli();
+ // 鏉′欢2锛氶鍞粨鏉熸椂闂� >= 褰撳墠鏃堕棿 OR 缁撴潫鏃堕棿涓虹┖
+ filterBuilder.must(QueryBuilders.boolQuery()
+ .should(QueryBuilders.rangeQuery("preSaleEndDate").gte(time))
+ .should(QueryBuilders.boolQuery()
+ .mustNot(QueryBuilders.existsQuery("preSaleEndDate"))));
+ // 鏉′欢1锛氶鍞紑濮嬫椂闂� <= 褰撳墠鏃堕棿 OR 寮�濮嬫椂闂翠负绌�
+ filterBuilder.must(QueryBuilders.boolQuery()
+ .should(QueryBuilders.rangeQuery("preSaleBeginDate").lte(time))
+ .should(QueryBuilders.boolQuery()
+ .mustNot(QueryBuilders.existsQuery("preSaleBeginDate"))));
+ }
//浠锋牸鍖洪棿鍒ゅ畾
if (CharSequenceUtil.isNotEmpty(searchDTO.getPrice())) {
String[] prices = searchDTO.getPrice().split("_");
@@ -604,7 +675,7 @@
filterFunctionBuilders.toArray(builders);
FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(goodsNameMatchQuery, builders)
.scoreMode(FunctionScoreQuery.ScoreMode.SUM)
- .setMinScore(2);
+ .setMinScore(0);
//鑱氬悎鎼滅储鍒欏皢缁撴灉鏀惧叆杩囨护鏉′欢
filterBuilder.must(functionScoreQueryBuilder);
filterBuilder.should(QueryBuilders.boolQuery().should(QueryBuilders.matchPhraseQuery("goodsName", keyword).boost(10)));
--
Gitblit v1.8.0