数据聚合

  • 实现对数据的统计、分析、运算
  • 聚合的分类

    • 桶(Bucket)聚合:用来对文档做分组

      • TermAggregation:按照文档字段值分组
      • Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组
        1. GET /hotel/_search
        2. {
        3. "size": 0, // 设置size为0,结果中不包含文档,只包含聚合结果
        4. "aggs": { // 定义聚合
        5. "brandAgg": { //给聚合起个名字
        6. "terms": { // 聚合的类型,按照品牌值聚合,所以选择term
        7. "field": "brand", // 参与聚合的字段
        8. "size": 20 // 希望获取的聚合结果数量
        9. }
        10. }
        11. }
        12. }
    • 度量(Metric)聚合:用以计算一些值,比如:最大值、最小值、平均值等

      • Avg:求平均值
      • Max:求最大值
      • Min:求最小值
      • Stats:同时求max、min、avg、sum等
        1. GET /hotel/_search
        2. {
        3. "size": 0,
        4. "aggs": {
        5. "brandAgg": {
        6. "terms": {
        7. "field": "brand",
        8. "size": 20
        9. },
        10. "aggs": { // 是brands聚合的子聚合,也就是分组后对每组分别计算
        11. "score_stats": { // 聚合名称
        12. "stats": { // 聚合类型,这里stats可以计算min、max、avg等
        13. "field": "score" // 聚合字段,这里是score
        14. }
        15. }
        16. }
        17. }
        18. }
        19. }
    • 管道(pipeline)聚合:其它聚合的结果为基础做聚合

      小结

      aggs代表聚合,与query同级,此时query的作用:

  • 限定聚合的的文档范围

聚合必须的三要素:

  • 聚合名称
  • 聚合类型
  • 聚合字段

聚合可配置属性有:

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

    RestAPI实现聚合

    image.png
    image.png

    面试题:

    多条件检索,结果高亮处理 (业务场景 索引库设计 实现流程)

  • 查看day06_微服务_ES搜索02

    按距离排序 查询离我最近的XXX (业务场景 索引库设计 实现流程)

  • 查看day06_微服务_ES搜索02

    XXX竞价排名? (业务场景 索引库设计 实现流程)

  • 查看day06_微服务_ES搜索02

    聚合查询搜索条件? (业务场景 索引库设计 实现流程)

  • aggs代表聚合,与query同级,此时query的作用:

  • 限定聚合的的文档范围

聚合必须的三要素:

  • 聚合名称
  • 聚合类型
  • 聚合字段

聚合可配置属性有:

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

    自动补全及拼音查询? (业务场景 索引库设计 实现流程)

  • 根据用户输入的字母,提示完整词条的功能

    拼音分词器

  • 实现根据字母做补全,就必须对文档按照拼音分词

    • ①解压
    • ②上传到虚拟机中,elasticsearch的plugin目录
    • ③重启elasticsearch
    • ④测试
  • 索引库设计

    1. POST /_analyze
    2. {
    3. "text": "如家酒店还不错",
    4. "analyzer": "pinyin"
    5. }

    自定义分词器

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

    • lcharacter filters:在tokenizer之前对文本进行处理。例如删除字符、替换字符
    • ltokenizer:将文本按照一定的规则切割成词条(term)。例如keyword,就是不分词;还有ik_smart
    • ltokenizer filter:将tokenizer输出的词条做进一步处理。例如大小写转换、同义词处理、拼音处理等
      1. PUT /test
      2. {
      3. "settings": {
      4. "analysis": {
      5. "analyzer": { // 自定义分词器
      6. "my_analyzer": { // 分词器名称
      7. "tokenizer": "ik_max_word",
      8. "filter": "py"
      9. }
      10. },
      11. "filter": { // 自定义tokenizer filter
      12. "py": { // 过滤器名称
      13. "type": "pinyin", // 过滤器类型,这里是pinyin
      14. "keep_full_pinyin": false,
      15. "keep_joined_full_pinyin": true,
      16. "keep_original": true,
      17. "limit_first_letter_length": 16,
      18. "remove_duplicated_term": true,
      19. "none_chinese_pinyin_tokenize": false
      20. }
      21. }
      22. }
      23. },
      24. "mappings": {
      25. "properties": {
      26. "name": {
      27. "type": "text",
      28. "analyzer": "my_analyzer",
      29. "search_analyzer": "ik_smart"
      30. }
      31. }
      32. }
      33. }

      总结:

      如何使用拼音分词器?
  • ①下载pinyin分词器

  • ②解压并放到elasticsearch的plugin目录
  • ③重启即可

如何自定义分词器?

  • ①创建索引库时,在settings中配置,可以包含三部分
  • ②character filter
  • ③tokenizer
  • ④filter

拼音分词器注意事项?

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

    自动补全查询

  • 参与补全查询的字段必须是completion类型。

  • 字段的内容一般是用来补全的多个词条形成的数组

    es和mysql数据同步思路?

  • 方案一 同步调用

image.png

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

image.png

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

image.png

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

    es如何保证高可用?(集群介绍)

  • 搭建es集群

    es集群中分片和副本介绍?

  • 集群(cluster)

    • 一组拥有共同的 cluster name 的节点
  • 节点 ( node )
    • 集群中的一个 Elasticearch 实例
  • 主分片(Primary shard)
    • 相对于副本分片的定义
  • 分片 ( shard )
    • 索引可以被拆分为不同的部分进行存储,称为分片。在集群环境下,一个索引的不同分片可以拆分到不同的节点中
  • 副本分片(Replica shard)

    • 每个主分片可以有一个或者多个副本,数据和主分片一样

      es集群中的脑裂现象?

  • 脑裂是因为集群中的节点失联导致的

    • 一个集群中,主节点与其它节点失联
    • 此时,node2和node3认为node1宕机,就会重新选主
    • 当node3当选后,集群继续对外提供服务,node2和node3自成集群,node1自成集群,两个集群数据不同步,出现数据差异
    • 当网络恢复后,因为集群中有两个master节点,集群状态的不一致,出现脑裂的情况
  • 解决方案

    • 要求选票超过 ( eligible节点数量 + 1 )/ 2 才能当选为主,因此eligible节点数量最好是奇数。对应配置项是discovery.zen.minimum_master_nodes,在es7.0以后,已经成为默认配置,因此一般不会发生脑裂问题

      es集群中的故障转移? (集群容错)

  • master宕机后,EligibleMaster选举为新的主节点。

  • master节点监控分片、节点状态,将故障节点上的分片转移到正常节点,确保数据安全