【Elasticsearch】-聚合查询

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: ES作为搜索引擎兼数据库,同样提供了强大的聚合分析能力。它基于查询条件来对数据进行分桶、计算的方法。有点类似于 SQL 中的 group by 再加一些函数方法的操作。聚合可以嵌套,由此可以组成复杂的操作(Bucketing聚合可以包含sub-aggregation)。

ES作为搜索引擎兼数据库,同样提供了强大的聚合分析能力。它基于查询条件来对数据进行分桶、计算的方法。有点类似于 SQL 中的 group by 再加一些函数方法的操作。聚合可以嵌套,由此可以组成复杂的操作(Bucketing聚合可以包含sub-aggregation)。

聚合计算的值可以取字段的值,也可是脚本计算的结果。查询请求体中以aggregations节点的语法定义

"aggregations" : {                        //也可简写为 aggs

   "" : {      //聚合的名字

       "" : {     //聚合的类型

                 //聚合体:对哪些字段进行聚合

       }

       [,"meta" : {  [] } ]?                 //元

       [,"aggregations" : { []+ } ]?   //在聚合里面在定义子聚合

   }

   [,"" : { ... } ]*                      //聚合的名字

}

单值输出

ES中大多数的数学计算只能输出一个值,比如max、min、avg、sum、cardinality

GET indexName/_search

{

 "aggs"{

  "aggs_name":{  #聚合分析的名字有用户自定义

  "aggs_type":{


        }  

  }

}

}

多值输出

stats

查询员工工资信息,包括数量、最大值、最小值、平均值、和。

要求字段属性必须是数值类型

GET employee/_search

{

 "size": 0,

 "aggs": {

   "sal_info": {

     "stats": {

       "field": "sal"

     }

   }

 }

}


terms

查询到达不同国家的航班数量,对数据进行分组并统计出每一组总数。

以下api是按照目的地进行分组,没统计到达每个国家航班的数量

GET kibana_sample_data_flights/_search

{

 "size": 0,

 "aggs": {

   "aaaa": {

     "terms": {

       "field": "DestCountry",

       "size": 10

     }

   }

 }

}

top_hits

  年龄最大的两个员工

GET employee/_search

{

 "size": 0,

 "aggs": {

   "max_two_age": {

     "top_hits": {

       "size": 2

       , "sort": [{

         "age": {"order": "desc"}

       }]

     }

   }

 }

}

range

请注意,此聚合包括每个范围的from值,不包括to值。

例如查询不同工资区间员工工资的统计信息

GET employee/_search

{

 "size": 0,

 "aggs": {

   "range_sal_info": {

     "range": {

       "field": "sal"

       , "ranges": [

         {"key":"0 <= sal < 10001",

           "to": 10001

         },

         {"key": "10001<= sal <20001",

           "from": 10001,

           "to": 20001

         },

         {"key": "20001<= sal <30001",

           "from": 20001,

           "to": 30001

         }

       ]

             }

   }

 }

}


histogram

以某个固定值为区间查询某个范围内的聚合

比如以5000为固定值,查询工资区间的信息

GET employee/_search

{

 "size": 0,

 "aggs": {

   "range_sal_info": {

     "histogram": {

       "field": "sal",

       "interval": 5000,

       "extended_bounds": {

         "min": 5000,

         "max": 20000

       }

             }

   }

 }

}


min_bucket

A sibling pipeline aggregation which identifies the bucket(s) with the minimum value of a specified metric in a sibling aggregation and outputs both the value and the key(s) of the bucket(s). The specified metric must be numeric and the sibling aggregation must be a multi-bucket aggregation.

分组后最小的桶.

查询平均工资最低的工种

GET employee/_search

{"size": 0,

 "aggs": {

   "job_info": {

     "terms": {

       "field": "job"

     },

     "aggs": {

       "diff_job_avg_sal": {

         "avg": {

           "field": "sal"

         }

       }

     }

   },

   "min_avg_job_info":{

       "min_bucket":{

         "buckets_path":"job_info>diff_job_avg_sal"

       }

     }

 }

}

全局过滤

查询年龄大于30岁的员工平均工资

GET employee/_search

{

 "size": 0,

 "query": {

   "range": {

     "age": {

       "gt": 30

     }

   }

 },

 "aggs": {

   "gt_30_avg_info": {

     "avg": {

       "field": "sal"

     }

   }

 }

}

查询岗位为JAVA开发的平均工资,使用constant_score,不计算相关性分数

GET employee/_search

{

 "size": 0,

 "query": {

   "constant_score": {

     "filter": {

       "term": {

         "job": "java"

         

       }

       }

     }

 },

 "aggs": {

   "gt_30_avg_info": {

     "avg": {

       "field": "sal"

     }

   }

 }

}

局部过滤

查询所有员工平均工资和年龄大于30岁的平均工资

GET employee/_search

{

 "size": 0,

 "aggs": {

   "all_emp_agv_sal": {

     "avg": {

       "field": "sal"

     }

   },

   "gt_30_emp_avg_info":{

     "filter": {

       "range": {

         "age": {

           "gt": 30

         }

       }

     }

   , "aggs": {

     "NAME": {

       "avg": {

         "field": "sal"

       }

     }

   }

   }

 }

}

推荐搜索

suggest

在搜索过程中,因为单词的拼写错误,没有得到任何的结果,希望ES能给我们一个推荐的搜索。

GET movies/_search

{

 "suggest": {

   "YOUR_SUGGESTION": {

     "text": "beauty",

     "term": {

       "field": "title",

       "suggest_mode":"missing"

     }

   }

 }

}

suggestJ_mode,有三个值:popular、missing 、always。默认时missing

  1. popular 是推荐词频更高的一些搜索
  2. missing 是当没有要搜索的结果时才推荐,倒排索引中没有此关键次。
  3. always 无论什么情况下都进行推荐

自动补全

completion

自动补全是我们在日常开发过程中最常见的搜索方式,比如百度搜索、淘宝的商品搜索。

es是通过特殊的数据结构实现,并不是通过传统意义的倒排索引实现。

前缀搜索API,其中size,限制返回多少条数据,skip_duplicates是自动去重。

GET movies/_search

{

 "suggest": {

   "YOUR_SUGGESTION": {

      "prefix" : "beauty",

     "completion" : {

       "field" : "title",

       "size":"20",

       "skip_duplicates":"true"

     }

     }

 }

}

高亮显示

将搜索结果进行高亮显示。

# 将title和genre中所有的romance进行高亮显示,通过pre_tages和post_tags定制前缀标签和后缀标签。

GET movies/_search

{

 "query": {

   "multi_match": {

     "query": "romance",

     "fields": ["title","genre"]

   }

 },

 "highlight": {

   "pre_tags": "",

   "post_tags": "",  

   "fields": {

     "title": {},

     "genre": {}

   }

 }

}



GET movies/_search

{

 "query": {

  "bool": {

    "must": [

      {"match": {

        "year": 2012

       }

      },

      {"match":{

        "title": "Avengers, The"

       }

      }

     

    ]

  }

},

"highlight": {

"fields": {

 "year": {},

 "genre": {

   "pre_tags": "",

   "post_tags": "",

   "highlight_query": {

     "match": {

       "genre": "Action"

     }

   }

 }

}

}

}

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
1月前
|
存储 SQL 监控
|
2月前
|
存储 JSON 监控
大数据-167 ELK Elasticsearch 详细介绍 特点 分片 查询
大数据-167 ELK Elasticsearch 详细介绍 特点 分片 查询
54 4
|
2月前
|
自然语言处理 搜索推荐 Java
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(一)
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图
55 0
|
2月前
|
存储 自然语言处理 搜索推荐
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(二)
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(二)
38 0
|
3月前
|
存储 自然语言处理 关系型数据库
ElasticSearch基础3——聚合、补全、集群。黑马旅游检索高亮+自定义分词器+自动补全+前后端消息同步
聚合、补全、RabbitMQ消息同步、集群、脑裂问题、集群分布式存储、黑马旅游实现过滤和搜索补全功能
ElasticSearch基础3——聚合、补全、集群。黑马旅游检索高亮+自定义分词器+自动补全+前后端消息同步
|
3月前
|
JSON 自然语言处理 算法
ElasticSearch基础2——DSL查询文档,黑马旅游项目查询功能
DSL查询文档、RestClient查询文档、全文检索查询、精准查询、复合查询、地理坐标查询、分页、排序、高亮、黑马旅游案例
ElasticSearch基础2——DSL查询文档,黑马旅游项目查询功能
|
4月前
|
自然语言处理 Java 关系型数据库
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
148 1
|
4月前
|
存储 自然语言处理 Java
ElasticSearch 实现分词全文检索 - 经纬度定位商家距离查询
ElasticSearch 实现分词全文检索 - 经纬度定位商家距离查询
56 0
|
4月前
|
自然语言处理 Java
ElasticSearch 实现分词全文检索 - 高亮查询
ElasticSearch 实现分词全文检索 - 高亮查询
74 0
|
4月前
|
缓存 自然语言处理 Java
ElasticSearch 实现分词全文检索 - filter查询
ElasticSearch 实现分词全文检索 - filter查询
47 0