ES中 同时使用should和must 导致只有must生效 解决方案
失效的原因就是must 和should在一起使用会不生效, 如果全部都是must是不影响的.
加入一个字段需要有类似 url =a or url =b 时, 我们就单独给他顶一个 BoolQueryBuilder urlQuery = boolQuery();
然后最后别忘了 mustQuery.must(urlQuery );
即可 , 如果后续你的其他字段也需要should, 比如name 你可以再定一个BoolQueryBuilder nameQuery= boolQuery()
,最后别忘了mustQuery.must(nameQuery)
public NativeSearchQuery getCcNativeSearchQuery(UserLogRecordPo condition, PageParam pageParam) {
Sort sortBy = Sort.by(CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, pageParam.getSortCondition())).descending();
if (StringUtils.equalsIgnoreCase("asc", pageParam.getSortModel())) {
sortBy = sortBy.ascending();
}
Pageable pageable = PageRequest.of(pageParam.getPageNum() - 1, pageParam.getPageSize(), sortBy);
if (StringUtils.isEmpty(pageParam.getSortCondition())) {
pageParam.setSortCondition("requestTime");
}
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
BoolQueryBuilder mustQuery = boolQuery();
BoolQueryBuilder requestUrlShouldQuery = boolQuery();
BoolQueryBuilder emailShouldQuery = boolQuery();
if (StringUtils.isNotBlank(condition.getServerName())){
mustQuery.must(
boolQuery().must(matchPhraseQuery("serverName.keyword", condition.getServerName()))
);
}
if (condition.getStatus()!= null){
mustQuery.must(
boolQuery().must(matchPhraseQuery("status", condition.getStatus()))
);
}
if (StringUtils.isNotEmpty(condition.getRequestUrl())) {
for (String requestUri : condition.getRequestUrl().split(",")) {
requestUrlShouldQuery.should(matchPhraseQuery("requestUri", requestUri)
);
}
} else {
List<String> accOperateList = ProcessLogReceiver.accOperateList;
for (String operator : accOperateList) {
requestUrlShouldQuery.should(matchPhraseQuery("requestUri", operator));
}
}
if (condition.getStartTime() != null && condition.getEndTime() != null) {
mustQuery.must(
rangeQuery("requestTime")
.gte(condition.getStartTime())
.lt(condition.getEndTime())
);
}
if (StringUtils.isNotBlank(condition.getIp())){
mustQuery.must(matchPhraseQuery("ip",condition.getIp())
);
}
if (StringUtils.isNotEmpty(condition.getEmail())) {
for (String email : condition.getEmail().split(",")) {
emailShouldQuery.should(matchPhraseQuery("email", email));
}
}
if (StringUtils.isNotEmpty(condition.getParams())) {
String params = condition.getParams();
String[] paramArray = params.split(",");
for (String param : paramArray) {
mustQuery.must(matchPhraseQuery("params", param));
}
}
mustQuery.must(requestUrlShouldQuery);
mustQuery.must(emailShouldQuery);
return nativeSearchQueryBuilder.withQuery(mustQuery)
.withPageable(pageable)
.build();
}