昨日内容回顾:

  1. from+size 不能大于10000会有深度分页问题 (百度大约只能翻76页)
  2. highlight 高亮三要素:那个字段高亮、前置、后置标签
  3. 返回结果:A、高亮结果单独的在一个字段中
  4. Bsource内容并没有高亮处理

今日学习知识:上午

学习内容:数据聚合、自动补全、数据同步(数据库、索引库)、集群(搭建集权、es面试点)

数据聚合:

  1. 1Bucket aggregations 分组(桶)聚合:
  2. 2Metrics aggregations 度量聚合:最大、最小、平均值
  3. 3Pipeline aggregations 管道聚合:可以进行嵌套、聚合结果再做聚合
  4. //--1、什么是聚合: 聚合是对文档数据的统计、分析、计算
  5. //--2、聚合字段必须是:keyword、数值、布尔、日期
  6. 分词字段不能聚合、不能排序

分组聚合:

  1. #对所有文档进行聚合统计、统计当前有哪些品牌
  2. GET hotel/_search
  3. {
  4. "size": 0, //:设置结果只包含聚合结果
  5. "aggs": { //:定义集合,设置聚合条件
  6. "brandAgg": { //:自定义的聚合名称
  7. "terms": { //:分组
  8. "field": "brand", //:按照那个字段分组、指定字段分组
  9. "size": 3 //:显示几条分组结果
  10. "order": {
  11. "_count": "asc" //:按照count升序排序
  12. }
  13. }
  14. },
  15. "cityAgg":{
  16. "terms": {
  17. "field": "city",
  18. "size": 8
  19. }
  20. }
  21. }
  22. //--1、聚合必须三要素:名称、类型、字段聚合
  23. //--2、现在文档聚合范围

RestAPI实现聚合:

分组值、分组数量

聚合-RestClient:

对接前端接口:

  1. //1、创建搜索请求
  2. //2、设置query查询条件
  3. //3、设置size = 0
  4. //4、设置 聚合请求条件 brand分组 city分组 starName分组
  5. //5、执行聚合搜索请求
  6. //6、解析响应内容 获取聚合结果 brand分组 city分组 starName分组
  7. //7、将结果封装成 Map<String,List<String>>

自动补全:

自定义分词器:

  1. 不用写--老师都写不出来--理解最重要!! 支持拼音搜索 //步骤:1、下载pinyin分词器到虚拟机里 2、重启
  2. PUT /test
  3. {
  4. "settings": {
  5. "analysis": {
  6. "analyzer": { // 自定义分词器
  7. "my_analyzer": { // 自定义分词器名称
  8. "tokenizer": "ik_max_word",
  9. "filter": "py"
  10. }
  11. },
  12. "filter": { // 自定义tokenizer filter
  13. "py": { // 过滤器名称
  14. "type": "pinyin", // 过滤器类型,这里是pinyin
  15. "keep_full_pinyin": false,
  16. "keep_joined_full_pinyin": true,
  17. "keep_original": true,
  18. "limit_first_letter_length": 16,
  19. "remove_duplicated_term": true,
  20. "none_chinese_pinyin_tokenize": false
  21. }
  22. }
  23. }
  24. },
  25. "mappings": { //--映射
  26. "properties": {
  27. "name": {
  28. "type": "text",
  29. "analyzer": "my_analyzer",
  30. "search_analyzer": "ik_smart"
  31. }
  32. }
  33. }
  34. }
  35. //--面试官会问遇到那些问题?? 需回答 有
  36. 映射 为避免搜到同音字 搜索时,不要使用拼音分词器搜索条件改为ik分词器

RestAPI实现自动补全:

先看请求参数构造的API:

酒店数据自动补全:

实现思路如下:

今日学习知识:下午

数据同步:

  1. 1、同步调用:实现简单、业务耦合度高
  2. 2、异步通知:低耦合、依赖mq的可靠性
  3. 3、监听binlong:完全解除服务间耦合、开启binloh增加数据库负担

监听 :队列、交换机、路由

ES集群

  1. 高可用方案 主分片和副分片不会再一台机器上 每一个节点 都会有一个副本
  2. es里面有自己的节点通讯机制 故障恢复
  1. master ture 主节点 data false 子节点
  1. // -- 跟面试官聊天的时候,主动去说分页的知识!!! 加分项
  2. 分布式新增如何确定分片??
  3. coordinating node 根据idhash运算,得到结果对shard数量区域,余数就是对应的分片
  4. 分布式查询的两个阶段
  5. 分散阶段: coordinating node将查询请求分发给不同分片
  6. 收集阶段: 将查询结果汇总到 coordinating node ,整理并返回给用户d

自动补全

自定义分词器

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

        • character filters:在tokenizer之前对文本进行处理。例如删除字符、替换字符
        • tokenizer:将文本按照一定的规则切割成词条(term)。例如keyword,就是不分词,还有ik_smart
        • 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节点监控分片、节点状态,将故障节点上的分片转移到正常节点,确保数据安全