数据聚合
- 实现对数据的统计、分析、运算
聚合的分类
桶(Bucket)聚合:用来对文档做分组
- TermAggregation:按照文档字段值分组
- Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组
GET /hotel/_search{"size": 0, // 设置size为0,结果中不包含文档,只包含聚合结果"aggs": { // 定义聚合"brandAgg": { //给聚合起个名字"terms": { // 聚合的类型,按照品牌值聚合,所以选择term"field": "brand", // 参与聚合的字段"size": 20 // 希望获取的聚合结果数量}}}}
度量(Metric)聚合:用以计算一些值,比如:最大值、最小值、平均值等
- Avg:求平均值
- Max:求最大值
- Min:求最小值
- Stats:同时求max、min、avg、sum等
GET /hotel/_search{"size": 0,"aggs": {"brandAgg": {"terms": {"field": "brand","size": 20},"aggs": { // 是brands聚合的子聚合,也就是分组后对每组分别计算"score_stats": { // 聚合名称"stats": { // 聚合类型,这里stats可以计算min、max、avg等"field": "score" // 聚合字段,这里是score}}}}}}
-
小结
aggs代表聚合,与query同级,此时query的作用:
限定聚合的的文档范围
聚合必须的三要素:
- 聚合名称
- 聚合类型
- 聚合字段
聚合可配置属性有:
- size:指定聚合结果数量
- order:指定聚合结果排序方式
-
RestAPI实现聚合
面试题:
多条件检索,结果高亮处理 (业务场景 索引库设计 实现流程)
-
按距离排序 查询离我最近的XXX (业务场景 索引库设计 实现流程)
-
XXX竞价排名? (业务场景 索引库设计 实现流程)
-
聚合查询搜索条件? (业务场景 索引库设计 实现流程)
aggs代表聚合,与query同级,此时query的作用:
- 限定聚合的的文档范围
聚合必须的三要素:
- 聚合名称
- 聚合类型
- 聚合字段
聚合可配置属性有:
- size:指定聚合结果数量
- order:指定聚合结果排序方式
-
自动补全及拼音查询? (业务场景 索引库设计 实现流程)
-
拼音分词器
实现根据字母做补全,就必须对文档按照拼音分词
- ①解压
- ②上传到虚拟机中,elasticsearch的plugin目录
- ③重启elasticsearch
- ④测试
索引库设计
POST /_analyze{"text": "如家酒店还不错","analyzer": "pinyin"}
自定义分词器
elasticsearch中分词器(analyzer)的组成包含三部分:
- lcharacter filters:在tokenizer之前对文本进行处理。例如删除字符、替换字符
- ltokenizer:将文本按照一定的规则切割成词条(term)。例如keyword,就是不分词;还有ik_smart
- ltokenizer filter:将tokenizer输出的词条做进一步处理。例如大小写转换、同义词处理、拼音处理等
PUT /test{"settings": {"analysis": {"analyzer": { // 自定义分词器"my_analyzer": { // 分词器名称"tokenizer": "ik_max_word","filter": "py"}},"filter": { // 自定义tokenizer filter"py": { // 过滤器名称"type": "pinyin", // 过滤器类型,这里是pinyin"keep_full_pinyin": false,"keep_joined_full_pinyin": true,"keep_original": true,"limit_first_letter_length": 16,"remove_duplicated_term": true,"none_chinese_pinyin_tokenize": false}}}},"mappings": {"properties": {"name": {"type": "text","analyzer": "my_analyzer","search_analyzer": "ik_smart"}}}}
总结:
如何使用拼音分词器?
①下载pinyin分词器
- ②解压并放到elasticsearch的plugin目录
- ③重启即可
如何自定义分词器?
- ①创建索引库时,在settings中配置,可以包含三部分
- ②character filter
- ③tokenizer
- ④filter
拼音分词器注意事项?

- 优点:实现简单,粗暴
- 缺点:业务耦合度高
- 方案二 异步调用

- 优点:低耦合,实现难度一般
- 缺点:依赖mq的可靠性
- 方案三 监听binlog

-
es集群中分片和副本介绍?
集群(cluster)
- 一组拥有共同的 cluster name 的节点
- 节点 ( node )
- 集群中的一个 Elasticearch 实例
- 主分片(Primary shard)
- 相对于副本分片的定义
- 分片 ( shard )
- 索引可以被拆分为不同的部分进行存储,称为分片。在集群环境下,一个索引的不同分片可以拆分到不同的节点中
副本分片(Replica shard)
脑裂是因为集群中的节点失联导致的
- 一个集群中,主节点与其它节点失联
- 此时,node2和node3认为node1宕机,就会重新选主
- 当node3当选后,集群继续对外提供服务,node2和node3自成集群,node1自成集群,两个集群数据不同步,出现数据差异
- 当网络恢复后,因为集群中有两个master节点,集群状态的不一致,出现脑裂的情况
解决方案
master宕机后,EligibleMaster选举为新的主节点。
- master节点监控分片、节点状态,将故障节点上的分片转移到正常节点,确保数据安全

