因为最近要从elasticsearch中获取数据给前端展示,然后自己摸索到了一些查询方法,记录一下,以防忘记
只展示业务层的代码逻辑:
一、一次普通的查询方法:
public ResultVO<List<PageVO<PageVulVo>>> page(PageParam param, @ResTypeValue String[] resTypeValues) {
//排序
if (StringUtils.isEmpty(param.getSortParams())) {
param.setSortParams("first_time desc");
}
String sortParams = param.getSortParams();
//搜索字段
// Map<String, Object> map = ParamUtils.getMapBySearch(param);
List<SearchParam> searchParams = param.getSearchParams();
//查询条件
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
this.queryVul(searchParams, nativeSearchQueryBuilder);
//排序和分页
PubUtils.sortAndPage(sortParams, nativeSearchQueryBuilder, param);
//过滤
nativeSearchQueryBuilder.withCollapseField("code");
//查询
Page<RealVul> pageResult = realVulRepository.search(nativeSearchQueryBuilder.build());
//组装
List<PageVulVo> pageVulVoList = pageResult.getContent().stream().map(e -> new PageVulVo(e)).collect(Collectors.toList());
//返回
return ResultUtils.pageOk(pageVulVoList, pageResult.getTotalElements());
}
搜索条件方法:
public NativeSearchQueryBuilder queryVul(List<SearchParam> searchParams, NativeSearchQueryBuilder nativeSearchQueryBuilder) {
//查询条件
BoolQueryBuilder mustQuery = QueryBuilders.boolQuery();
for (SearchParam searchParam : searchParams) {
String value = searchParam.getFieldValue();
String name = searchParam.getFieldName();
switch (name){
case "vul_name":
mustQuery.must(QueryBuilders.wildcardQuery("vul_name", "*" + value + "*"));
break;
case "cve_code":
mustQuery.must(QueryBuilders.matchQuery("cve_code", value));
break;
case "port":
mustQuery.must(QueryBuilders.matchQuery("port",value));
break;
case "scan_type":
mustQuery.must(QueryBuilders.matchQuery("scan_type",value));
break;
case "create_time":
List<Long> createTime = DateUtils.parseStringToLong(value);
mustQuery.must(QueryBuilders.rangeQuery("create_time").gte(createTime.get(0)).lte(createTime.get(1)));
break;
default:
break;
}
}
nativeSearchQueryBuilder.withQuery(mustQuery);
return nativeSearchQueryBuilder;
}
分页和排序的方法:
public static NativeSearchQueryBuilder sortAndPage(String sortParams, NativeSearchQueryBuilder nativeSearchQueryBuilder, PageParam param) {
Pageable pageable = PageRequest.of(param.getCurrPage() - 1, param.getPageNums());
nativeSearchQueryBuilder.withPageable(pageable);
if (sortParams.toLowerCase().contains("desc")) {
nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort(sortParams.substring(0, sortParams.indexOf(" "))).order(SortOrder.DESC));
} else {
nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort(sortParams.substring(0, sortParams.indexOf(" "))).order(SortOrder.ASC));
}
return nativeSearchQueryBuilder;
}
这就是普通的查询办法。
二、带有统计和求最高级别的字段值
例如要对整个elastcsearch中的数据进行统计分组和巧合的时候,上述的方法就不能满足要求了。
例如要算出以下这种数据
第一列是求出最高级别,第二