elasticsearch搜索引擎的常用方法(四)聚合检索aggs

  • Post author:
  • Post category:其他


一、常用的聚合检索语句

统计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数(每页多少条数据)



版权声明:本文为Misaki_root原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。