| | |
| | | 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; |
| | | |
| | |
| | | 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()); |
| | | } |
| | |
| | | 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 { |
| | |
| | | |
| | | |
| | | 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)); |
| | | } |
| | |
| | | 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("_"); |
| | |
| | | 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))); |