peng
2 天以前 ef98f72cee0a50564724adee879b0849776ba997
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,10 +97,13 @@
            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());
        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());
    }
@@ -448,8 +455,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 {
@@ -462,7 +477,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));
            }
@@ -555,6 +570,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("_");
@@ -641,7 +673,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)));