Elasticsearch 知识点整理 一 (6)

比如下面的高亮,排序,分页,以及_source 指定需要的字段都可以进一步作用在query的结果上

"highlight":{ # 高亮显示 "fields":{ # 指定高亮的字段 "balance":{} }, "sort": [ # 指定排序条件 { "account_number": "asc" } # 按照账户余额降序 ], "from": 0, # 分页 "size": 10, # 每页的大小4,通过执行size=0,可以实现仅显示聚合结果而不显示命中的信息详情 "_source": ["account_number", "balance"], # 默认情况下,ES会返回全文JSON,通过_source可以指定返回的字段 聚合分析

聚合分析是基于doc value这样一个数据结果进行的,前面有说过,这个doc value 其实就是正排索引, 聚合分析就是根据某一个字段进行分组,要求这个字段是不能被分词的,如果被聚合的字段被分词,按照倒排索引的方式去索引的话,就不得不去扫描整个倒排索引(才可能将被聚合的字段找全,效率很低)

更多Aggregate 点击进入ES官网

三个概念:

什么是bucket?

bucket就是聚合得到的结果

什么是metric?

metric就是对bucket进行分析,如最最大值,最小值,平均值

什么是下钻?

下钻就是在现有的分好组的bucket继续分组,比如一个先按性别分组,再按年龄分组

聚合的关键字: aggs 和 query地位并列

# 使用聚合时,天然存在一个metric,就是当前bucket的count "aggs": { # 聚合 "group_by_state": { # 自定义的名字 "term": { "field": "balance" # 指定聚合的字段, 意思是 group by balance }, "terms": { # terms "field": {"value1","value2","value3"} # 指定聚合的字段, 意思是 group by balance } } }, "aggs": { # 聚合中嵌套聚合 "group_by_state": { "terms": { "field": "field1" }, "aggs": { # 聚合中嵌套聚合 "average_balance": { "avg": { "field": "field2" } } } } }, "aggs": { #嵌套聚合,并且使用内部聚合的结果集 "group_by_state": { "terms": { "field": "state.keyword", "order": { "average_balance": "desc" # 使用的下面聚合的结果集 } }, "aggs": { "average_balance": { "avg": { # avg 求平均值 metric "field": "balance" } }, "min_price": { "min": { # metric 求最小值 "field": "price" } }, "max_price": { "max": { # metric 求最大值 "field": "price" } }, "sum_price": { "sum": { # metric 计算总和 "field": "price" } }, } } }, "aggs": { # 先按照年龄分组,在按照性别分组,再按照平均工资聚合 # 最终的结果就得到了每个年龄段,每个性别的平均账户余额 "group_by_age": { "range": { "field": "age", "ranges": [ { "from": 20, "to": 30 } ] }, "aggs": { "group_by_gender": { "terms": { "field": "gender.keyword" }, "aggs": { "average_balance": { "avg": { "field": "balance" } } } } }, # histogram,类似于terms, 同样会进行bucket分组操作,接受一个field,按照这个field的值的各个范围区间进行分组操作 # 比如我们指定为2000, 它会划分成这样 0-2000 2000-4000 4000-6000 ... "aggs": { # 聚合中嵌套聚合 "group_by_price": { "histogram": { "field": "price", "interval":2000 }, "aggs": { # 聚合中嵌套聚合 "average_price": { "avg": { "field": "price" } } } } }, "aggs" : { "sales_over_time" : { # 根据日期进行聚合 "date_histogram" : { "field" : "date", "interval" : "1M",# 一个月为一个跨度 "format" : "yyyy-MM-dd", "min_doc_count":0 #即使这个区间中一条数据都没有,这个区间也要返回 } } } } } } filter aggregate

过滤加聚合,统计type=t-shirt的平均价格

POST /sales/_search?size=0 { "aggs" : { "t_shirts" : { "filter" : { "term": { "type": "t-shirt" } }, "aggs" : { "avg_price" : { "avg" : { "field" : "price" } } } } } } 嵌套聚合-广度优先

说一个应用于场景: 我们检索电影的评论, 但是我们先按照演员分组聚合,在按照评论的数量进行聚合

分析: 如果我们选择深度优先的话, ES在构建演员电影相关信息时,会顺道计算出电影下面评论数的信息,假如说有10万个演员的话, 10万*10=100万个电影 每个电影下又有很多影评,接着处理影评, 就这样内存中可能会存在几百万条数据,但是我们最终就需要50条,这种开销是很大的

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppgzd.html