一、常用的聚合检索语句
统计news索引下的所有新闻的发布机构分别有哪些
GET news/_search
{
"aggs": {
"publish_org": {
"terms": {
"field": "publish_org.keyword",
"size": 10
}
}
},
"size": 0
}
注意:
聚合的字段不能是text类型字段。如果es配置开启了fielddata=true,则聚合text类型不会报错,但是聚合出来的结果是text字段分词后词的聚合结果
结果如下:
{
"took" : 32,
"timed_out" : false,
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"hits" : {
"total" : 10000,
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"publish_org" : {
"doc_count_error_upper_bound" : 1601,
"sum_other_doc_count" : 173772,
"buckets" : [
{
"key" : "新京报",
"doc_count" : 97325
},
{
"key" : "华夏时报",
"doc_count" : 27339
},
{
"key" : "FX168财经网人物频道",
"doc_count" : 26442
},
{
"key" : "新华社",
"doc_count" : 16988
},
{
"key" : "国家发展改革委",
"doc_count" : 14284
},
{
"key" : "教育部",
"doc_count" : 12371
},
{
"key" : "证券时报网",
"doc_count" : 6981
},
{
"key" : "新华网",
"doc_count" : 6249
},
{
"key" : "澎湃新闻",
"doc_count" : 6237
},
{
"key" : "中国新闻网",
"doc_count" : 6129
}
]
}
}
}
返回字段说明(非官方):
aggregations:聚合的结果
publish_org:检索时自定义的返回结果名
buckets:聚合的结果集,结果数和size相同
key:聚合字段publish_org的值
count:publish_org字段对应的资讯数
doc_count_error_upper_bound、sum_other_doc_count的统计结果并不准确,不做解释。
二、多层聚合
统计news索引下的所有新闻的发布机构,并返回该发布机构发布的最早一篇新闻
GET news/_search
{
"aggs": {
"publish_org": {
"terms": {
"field": "publish_org.keyword",
"size": 10
},
"aggs": {
"result": {
"top_hits": {
"sort": [
{
"publish_time": {
"order": "desc"
}
}
],
"size": 1
}
}
}
}
},
"size": 0
}
检索结构说明:
第一层aggs:第一次聚合
publish_org:自定义第一次聚合结果集名称
terms:聚合查询
第二层aggs:在第一次聚合的结果中再次聚合
result:自定义第二层聚合结果集名称
top_hits:第二层聚合的hits结果(top_hits支持部分检索功能,如:sort、highlight、size等)
sort:排序
内层size:top_hits返回结果的数量
外层size:普通检索返回结果的数量
三、查询检索的所有buckets数量
统计news索引下的新闻共有多少个发布机构
GET news/_search
{
"aggs": {
"publish_org_count": {
"cardinality": {
"field": "publish_org.keyword",
"precision_threshold": 40000
}
}
},
"size": 0
}
检索结构说明:
publish_org_count:聚合结果集名称
cardinality:查询buckets数量
precision_threshold:统计精度
注意:
precision_threshold是以消耗服务器内存来换取统计精度的,慎用。es默认buckets数量为3000的为精确统计,也就是precision_threshold=3000,查过3000时,统计的数量均为模糊值,最大支持40000的精确统计
结果为:
{
"took" : 6642,
"timed_out" : false,
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"hits" : {
"total" : 123143,
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"publish_org_count" : {
"value" : 11083
}
}
}
四、聚合分页查询buckets
将以上查询的11080个新闻发布机构,分页展示
方法一:
第一步:查询buckets的总数,见以上(三)
第二步:将查询到的buckets总数,当成二次查询的size参数,即
GET news/_search
{
"aggs": {
"publish_org": {
"terms": {
"field": "publish_org.keyword",
"size": 11083
}
}
},
"size": 0
}
第三步:第二步将会查询出所有的buckets,然后根据自己想要的分页,代码层面进行手动分页处理
方法二:
第一步:查询buckets的总数,见以上(三)
第二步:手动将buckets均分成n等份,然后实现分页的聚合查询
计算方法说明如下:
1、使用cardinality获取buckets总数为11083
2、确定每一页展示的数据量size=10
3、计算分页数publish_org_count / 10 + 1 = 1109
4、拼接检索语句,如下
# 第一页数据检索
GET news/_search
{
"aggs": {
"publish_org": {
"terms": {
"field": "publish_org.keyword",
"include": {
"partition": 0,
"num_partitions": 1109
},
"size": 10
}
}
},
"size": 0
}
# 第二页数据检索
GET news/_search
{
"aggs": {
"publish_org": {
"terms": {
"field": "publish_org.keyword",
"include": {
"partition": 1,
"num_partitions": 1109
},
"size": 10
}
}
},
"size": 0
}
# 以此类推,每次请求修改对应的partition即可
语句说明(非官方):
include:聚合检索分页条件
partition:当前buckets(当前页数)
num_partitions:将所有的bucket均分成多少buckets(总共多少页)
内层size:每个buckets中含有的bucket数(每页多少条数据)