映射结构
"users": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
文档内容
我实际生成了50条测试数据
Java代码
使用RestHeightLevelClient,省去注入的代码
因为我需要统计的是,一共有多少种名字,所以直接获取了buckets的size,如果需要获取每个名字出现的次数,使用for循环对buckets进行遍历即可,聚合结构查看下边的查询结果
// 此处的your_index_name替换成你的索引名称
SearchRequest searchRequest = new SearchRequest("your_index_name");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.aggregation(
AggregationBuilders.terms("user_count").field("users.keyword").size(10)
);
searchRequest.source(sourceBuilder);
log.info("查询语句为:" + searchRequest.source().toString());
try {
SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Terms nestedAgg = response.getAggregations().get("user_count");
long value = nestedAgg.getBuckets().size();
log.info("数量为:" + value);
} catch (IOException e) {
log.info("查询出错");
}
生成的查询语句
POST /your_index_name/_search
{
"aggregations": {
"users_count": {
"terms": {
"field": "users.keyword",
"size": 10,
"min_doc_count": 1,
"shard_min_doc_count": 0,
"show_term_doc_count_error": false,
"order": [
{
"_count": "desc"
},
{
"_key": "asc"
}
]
}
}
}
}
查询结果
针对上述结构和查询语句,查询结果为
因只有50条测试数据,所以每个名字出现了50次,一共只有4个名字