1、日期查询问题
在使用restHighLevelClient进行日期时间查询的时候,发现返回结果不对,好像把查询条件前8小时的数据查出来了。原来是时区不对。因为es默认时区是UTC,所以在查询的时间要把日期时间类型转成UTC格式进行查询。
String lsType = param.getString(CommonConstants.LS_TYPE);
String submitTimeStart = param.getString(CommonConstants.SUBMIT_TIME_START);
String submitTimeEnd = param.getString(CommonConstants.SUBMIT_TIME_END);
Instant beginTime = DateUtils.getLocalDateTime(submitTimeStart).toInstant(ZoneOffset.UTC);
Instant endTime = DateUtils.getLocalDateTime(submitTimeEnd).toInstant(ZoneOffset.UTC);
// 条件构造
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
boolQueryBuilder.must(QueryBuilders.termQuery(CommonConstants.LS_TYPE + StringPoolConstant.DOT + CommonConstants.KEY_WORD, lsType));
List<String> statusList = Arrays.asList(OrderStatusEnum.ACCEPT.getCode(),OrderStatusEnum.CANCEL.getCode(),OrderStatusEnum.WAITING_ACCEPT.getCode());
boolQueryBuilder.must(QueryBuilders.termsQuery(CommonConstants.STATUS + StringPoolConstant.DOT + CommonConstants.KEY_WORD, statusList));
boolQueryBuilder.must(QueryBuilders.rangeQuery(CommonConstants.SUBMIT_TIME).gte(beginTime).lte(endTime));
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(boolQueryBuilder);
SearchRequest searchRequest = new SearchRequest(CommonConstants.ORDER);
searchRequest.source(searchSourceBuilder);
// 分页,不做高亮显示
List<JSONObject> objectList = esOperator.search(CommonConstants.ORDER, searchRequest, JSONObject.class);
2、多条件模糊匹配
BoolQueryBuilder shouldBuilder = new BoolQueryBuilder();
shouldBuilder.should(new WildcardQueryBuilder(CommonConstants.ORDER_CODE + ".keyword", fuzzyCode));
shouldBuilder.should(new WildcardQueryBuilder(CommonConstants.LOGISTIC_SERVICE_NAME + ".keyword", fuzzyCode));
shouldBuilder.should(new WildcardQueryBuilder(CommonConstants.LABORATORY_NAME + ".keyword", fuzzyCode));
boolQueryBuilder.must(shouldBuilder);