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