peng
6 天以前 d4d9ea89dd109cb975eaa3412a15c5ff6e8d11dd
framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java
@@ -48,6 +48,10 @@
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;
@@ -93,7 +97,9 @@
            cache.incrementScore(CachePrefix.HOT_WORD.getPrefix(), searchDTO.getKeyword());
        }
        NativeSearchQueryBuilder searchQueryBuilder = createSearchQueryBuilder(searchDTO, pageVo);
//        searchQueryBuilder.withCollapseField("goodsId.keyword");
        if (Objects.nonNull(searchDTO.getCanFilter()) && searchDTO.getCanFilter()) {
            searchQueryBuilder.withCollapseField("goodsId.keyword");
        }
        NativeSearchQuery searchQuery = searchQueryBuilder.build();
        searchQuery.setTrackTotalHits(true);
        log.debug("searchGoods DSL:{}", searchQuery.getQuery());
@@ -555,6 +561,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("_");