一.知识回顾
【0.ElasticSearch专栏在这里哟,想要学习的可自行进入专栏学习】
【1-ElasticSearch的基本介绍与用途、ElasticSearch中一些基本的概念、倒排索引的基本概念】
【2-Docker安装部署ElasticSearch和Kibanan详细步骤】
【3-ElasticSearch入门-索引的创建删除更新查询-文档的创建删除更新查询-Kibanan导入elasticsearch官方测试数据-postman测试】
【4-ElasticSearch中的检索方式-Kibana测试-Query DSL(domain-specific language 领域特定语言)常用的字段使用场景】
二.聚合(aggregations)
2.1 聚合的基本概念与语法规则
聚合可以让我们极其方便的实现对数据的统计、分析。实现这些统计功能的比数据库的sql要方便的多,而且查询速度非常快,可以实现实时搜索效果。
语法规则
"aggregations" : {
"<aggregation_name>" : {
"<aggregation_type>" : {
<aggregation_body>
}
[,"meta" : { [<meta_data_body>] } ]?
[,"aggregations" : { [<sub_aggregation>]+ } ]?
}
[,"<aggregation_name_2>" : { ... } ]*
}
2.2 Elasticsearch聚合中桶和度量的概念
Elasticsearch中的聚合,包含多种类型,最常用的两种,一个叫 桶
,一个叫 度量
:
2.2.1 桶(bucket)
桶的作用,是按照某种方式对数据进行分组,每一组数据在ES中称为一个 桶
。
Elasticsearch中提供的划分桶的方式有很多:
- Date Histogram Aggregation:根据日期阶梯分组,例如给定阶梯为周,会自动每周分为一组
- Histogram Aggregation:根据数值阶梯分组,与日期类似
- Terms Aggregation:根据词条内容分组,词条内容完全匹配的为一组
- Range Aggregation:数值和日期的范围分组,指定开始和结束,然后按段分组
- ……
bucket aggregations 只负责对数据进行分组,并不进行计算,因此往往bucket中往往会嵌套另一种聚合:metrics aggregations即度量
2.2.2 度量(metrics)
分组完成以后,我们一般会对组中的数据进行聚合运算,例如求平均值、最大、最小、求和等,这些在ES中称为 度量
比较常用的一些度量聚合方式:
- Avg Aggregation:求平均值
- Max Aggregation:求最大值
- Min Aggregation:求最小值
- Percentiles Aggregation:求百分比
- Stats Aggregation:同时返回avg、max、min、sum、count等
- Sum Aggregation:求和
- Top hits Aggregation:求前几
- Value Count Aggregation:求总数
- ……
2.3 案例实操
2.3.1 案例1:搜索address中包含mill的所有人的年龄分布以及平均年龄
#案例1:搜索address中包含mill的所有人的年龄分布以及平均年龄
GET /blank/_search
{
"query": {
"match": {
"address": "mill"
}
},
"aggs": {
"ageAgg": {
"terms": {
"field": "age",
"size": 10
}
},
"ageAve":{
"avg": {
"field": "age"
}
}
},"size": 0
}
2.3.2 案例2:按照年龄聚合,并且请求这些年龄段的这些人的平均薪资
# 按照年龄聚合,并且请求这些年龄段的这些人的平均薪资
GET /blank/_search
{
"query": {
"match_all": {}
},
"aggs": {
"ageAgg": {
"terms": {
"field": "age",
"size": 20
},
"aggs": {
"balanceAvg": {
"avg": {
"field": "balance"
}
}
}
}
},"size": 0
}
2.3.3 案例3:查出所有年龄分布,并且这些年龄段中M的平均薪资和F的平均薪资以及这个年龄段的总体平均薪资。
# 案例3:查出所有年龄分布,并且这些年龄段中M的平均薪资和F的平均薪资以及这个年龄段的总体平均薪资
GET /blank/_search
{
"query": {
"match_all": {}
},
"aggs": {
"ageAgg": {
"terms": {
"field": "age",
"size": 10
},
"aggs": {
"genderAgg": {
"terms": {
"field": "gender.keyword",
"size": 10
},
"aggs": {
"balanceAgg": {
"avg": {
"field": "balance"
}
}
}
},
"ageBalanceAvg": {
"avg": {
"field": "balance"
}
}
}
}
},"size": 0
}
三.映射配置(_mapping)
3.1 什么是映射?
映射是定义文档的过程,文档包含哪些字段,这些字段是否保存,是否索引,是否分词等
3.2 创建映射字段
PUT /索引库名/_mapping/类型名称
{
"properties": {
"字段名": {
"type": "类型",
"index": true,
"store": true,
"analyzer": "分词器"
}
}
}
类型名称:就是前面将的type的概念,类似于数据库中的不同表
字段名:类似于列名,properties下可以指定许多字段。
每个字段可以有很多属性。例如:
- type:类型,可以是text、long、short、date、integer、object等
- index:是否索引,默认为true
- store:是否存储,默认为false
- analyzer:分词器,这里使用ik分词器:
ik_max_word
或者ik_smart
3.3 新增映射字段
如果我们创建完成索引的映射关系后,又要添加新的字段的映射,这时怎么办?第一个就是先删除索引,然后调整后再新建索引映射,还有一个方式就在已有的基础上新增。
PUT /my_index/_mapping
{
"properties":{
"employee-id":{
"type":"keyword"
,"index":false
}
}
}
3.4 更新映射
对于存在的映射字段,我们不能更新,更新必须创建新的索引进行数据迁移
3.5 数据迁移
先创建出正确的索引,然后使用如下的方式来进行数据的迁移
POST_reindex [固定写法] { “source”:{ “index”:“twitter” }, “dest”:{ “index”:“new_twitter” } } |
---|
老的数据有type的情况
POST_reindex [固定写法] { “source”:{ “index”:“twitter”, “type”:“account” }, “dest”:{ “index”:“new_twitter” } } |
---|
好了,关于【5-ElasticSearch中聚合(aggregations)基本概念与语法规则-Elasticsearch聚合中桶和度量的概念-聚合案例实操-映射配置(_mapping)】就先学习到这里,更多的内容持续创作学习中。