聚合-分类

什么是聚合?

聚合是对文档数据的统计、分析、计算

聚合的常见种类有哪些?

Bucket(分桶):对文档数据分组,并统计每组数量
Metric(度量):对文档数据做计算,例如avg
Pipeline:基于其他聚合结果再做聚合

参与聚合的字段类型必须是:

keyword
数值
日期
布尔等
分词的字段不能参与

DSL实现Bucket聚合:

对所有文档进行聚合统计,统计都有哪些品牌 示例:
GET hotel/_search
{
“size”: 0, //设置size为0,结果中不包含文档,只包含聚合结果
“aggs”: { //定义聚合
“brandAgg”: { // 给聚合起个名字
“terms”: { // 聚合的类型,按照品牌值聚合,所以选择term
“field”: “brand”, // 参与聚合的字段
“size”: 20 // 希望获取的聚合结果数量
}
}
}
}
图片注释.png

aggs代表聚合,与query同级,此时加不加query的作用是什么?

限定聚合的文档范围,如果不加的话 代表统计全部

聚合必须的三要素:

1.聚合名称
2.聚合类型
3.聚合字段

聚合可配置属性有:

size:指定聚合结果数量
order:指定聚合结果排序方式
field:指定聚合字段

#嵌套查询 先按照品牌对文档分组,再进行各种求值: 聚合给我们封装了一个stats,里面有最大值,最小值,平均数等。示例:

GET hotel/_search
{
“size”: 0,
“aggs”: {
“termsByBrand”: {
“terms”: {
“field”: “brand”,
“size”: 20
},
“aggs”: { //是brands聚合的子聚合,也就是分组后对每组分别进行计算
“statsPrice”: { // 聚合名称
“stats”: { //聚合类型,这里stats可以计算min、max、avg等
“field”: “price” // 聚合字段,这里是price(价格)
}
}
}
}
}
}

RestAPI实现聚合

对接前端接口:

1.编写controller接口,接收该请求
2.修改Service层方法,添加RequestParam参数
3.修改getFilters方法的业务,聚合时添加query条件

自动补全

自定义分词器

1.elasticsearch中分词器(analyzer)的组成包含三部分:

  1. - character filters:在tokenizer之前对文本进行处理。例如删除字符、替换字符
  2. - tokenizer:将文本按照一定的规则切割成词条(term)。例如keyword,就是不分词,还有ik_smart
  3. - tokenizer filter:将tokenizer输出的词条做进一步处理。例如:大小写转换、同义词处理等

拼音分词器注意事项:

为了避免搜索到同音字,搜索时不要使用拼音分词器

自动补全对字段的要求:

1.类型是completion类型
2.字段值是多词条的数组

数据同步-问题分析

方式一:同步调用

优点:实现简单,粗暴
缺点:业务耦合度高

方式二:异步通知

优点:低耦合,实现难度一般
缺点:依赖mq的可靠性

方式三:监听binlog

优点:完全解除服务间耦合
缺点:开启binlog增加数据库负担、实现复杂度高

ES集群-集群节点职责:

master eligible节点的作用是什么?

1.参与集群选主
2.主节点可以管理集群状态、管理分片信息、处理创建和删除索引库的请求

data节点的作用是什么?

数据的CRUD

coordinator节点的作用是什么?

1.路由请求到其他节点
2.合并查询到的结果,返回给用户

ES集群-分布式:

分布式新增如何确定分片?

coordinating node根据id做hash运算,得到结果对shard数量取余,余数就是对应的分片

分布式查询的两个阶段

1.分散阶段:coordinating node将查询请求分发给不同分片
2.收集阶段:将查询结果汇总到coordinating node,整理并返回给用户

故障转移:

1.master宕机后,EligibleMaster选举为新的主节点。
2.master节点监控分片、节点状态,将故障节点上的分片转移到正常节点,确保数据安全。