第一步:准备包裹内容(构建查询条件)
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.termQuery("group_id", groupId));
boolQueryBuilder.must(QueryBuilders.termQuery("valid", true));
- 动作 :
QueryBuilders.boolQuery() - 意义:创建一个"查询条件容器"。就像拿一个空的快递箱。
- 动作 :
.must(...) - 意义 :往箱子里放具体的条件。
termQuery("group_id", groupId):要求group_id字段必须等于某个值(精准匹配)。termQuery("valid", true):要求valid字段必须为true。
- 总结 :这一步是在组装逻辑,告诉 ES 我们要找什么样的数据(既要属于某分组,又要有效)。
第二步:打包封箱(封装查询体)
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(boolQueryBuilder);
- 动作 :
new SearchSourceBuilder() - 意义 :拿出一张快递单模板。
- 动作 :
.query(...) - 意义 :把刚才装好条件的"箱子"(
boolQueryBuilder)贴在这张单子上。 - 总结 :这一步是把查询条件转换成 ES 能看懂的JSON 格式 (Source)。
SearchSourceBuilder还可以加其他东西,比如分页(from/size)、排序(sort),但这里我们只用了查询。
第三步:填写收件地址(创建请求对象)
CountRequest countRequest = new CountRequest(ArchivesGlobalConstant.PROFILE_INDEX_NAME);
countRequest.source(searchSourceBuilder);
- 动作 :
new CountRequest(...) - 意义 :准备一个专门用来"数数"的信封 ,并写上索引名(去哪个库房查)。
- 动作 :
.source(...) - 意义 :把刚才填好的"快递单"(
searchSourceBuilder)塞进这个信封里。 - 总结 :这一步确定了去哪里查 (索引名)和查什么(具体的查询体)。
第四步:发货并等待回执(执行请求)
CountResponse response = restHighLevelClient.count(countRequest, RequestOptions.DEFAULT);
return response.getCount();
- 动作 :
restHighLevelClient.count(...) - 意义:叫来快递员(HTTP 客户端),把信封发给 ES 服务器。
- 动作 :
response.getCount() - 意义:快递员回来了,手里拿了个小纸条,上面写着数字几就是几。
- 总结 :这一步是网络传输 和结果解析。ES 收到请求后,会扫描数据,统计匹配的文档数量,然后把数字返回。
简单模式(如果只是查个全表总数)
场景 :不需要任何条件,就是想知道一个索引里总共有多少条数据。
特点 :可以不用构建复杂的 SearchSourceBuilder,直接发请求。
// 只需要这一行核心代码,不需要包装 Query
CountRequest countRequest = new CountRequest("your_index_name");
CountResponse response = client.count(countRequest, RequestOptions.DEFAULT);
long count = response.getCount();