需求
使用Java查询es数据,查询时传入相关条件
方案
使用 org.elasticsearch.action.search.SearchRequest
查询
代码
// com.alibaba.fastjson.JSONObject
// JSONObject param = new JSONObject();
// 入参格式: systemId "sys_a,sys_b,sys_c"
String systemIds= param.getString("systemIds");
// 查询请求
SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 查询结构构造
BoolQueryBuilder shouldBuilder = new BoolQueryBuilder();
// 系统ID
if (StringUtils.isNotEmpty(systemIds)) {
String[] strings = systemIds.split(",");
for (String id : strings) {
// 因为ES查询结构中有'keyword' 字段,所以查询时也加上
shouldBuilder.should(QueryBuilders.termQuery("systemId.keyword", id));
}
}
// 开始结束时间范围
if (StringUtils.isNotEmpty(param.getString("startTime"))&&StringUtils.isNotEmpty(param.getString("endTime"))) {
shouldBuilder.should(QueryBuilders.rangeQuery("createdTime")
.gte(param.getDate("startTime").getTime())
.lte(param.getDate("endTime").getTime()));
}
// 查询
sourceBuilder.query(shouldBuilder);
// 分页
sourceBuilder.from((param.getInteger("pageNum") - 1) * param.getInteger("pageSize"));
// 每页数量
sourceBuilder.size(Integer.parseInt(param.get("pageSize").toString()));
// 排序
sourceBuilder.sort("createdTime", SortOrder.DESC);
// 请求构建
searchRequest.source(sourceBuilder);
try {
// 执行查询
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 命中结果
org.elasticsearch.search.SearchHits hits = searchResponse.getHits();
for (org.elasticsearch.search.SearchHit hit : hits) {
// 自定义遍历操作
}
} catch (IOException e) {
throw new RuntimeException(e);
}
查询 sourceBuilder 结构如下
注意事项
should查询
:类似OR查询,会将多个should条件进行OR查询,查询会出现不在should条件内的结果。