ES

79 阅读8分钟

一、基础知识

1、 GET /index/_type/number

index :索引名称 _type :文档类型 _关键字: 查询条件

2、 过滤器类型

  • fiter

  • range

3、 搜索关键字

  • match_phrase 匹配短语
  • hight_light

4、聚合

  • aggreations 聚合分析

5、基础名词

  • 集群

    • 实现高容错和高可用,运行在许多的相互合作的服务器上,
  • 节点

    • 形成集群的每个服务器成为节点
  • 索引

    • 保存数据的地方, 一个或者多个物理分片的逻辑命名空间,一组文档的集合
  • 分片

    • 一个工作单元、保存数据的容器, 查询应用与索引,ES会把查询发送给每个相关的分片,并将结果组合
  • 副本

    • 提高查询吞吐量或实现高可用性,可以使用分片副本
    • 副本是分片的精确复制,每个分片有0个或者多个副本,[保证数据不丢失]
  • 文档

  • 数据类型

    • string
    • byte short,interger,long
    • float,double
    • boolean
    • date

6、容量规划

  • 分片最大的容量 限制为30G
  • 根据节点数的1.5-3倍 创建分片
  • 对于日期的索引需求,建议把索引分配一个分片

二、集群内的原理

1、空集群

  • 一个单独的节点,里面不包含任何的数据和索引 :包含空内容节点的集群
  • 一个运行中的 Elasticsearch 实例称为一个节点,集群是由一个或者多个拥有相同 cluster.name 配置的节点组成, 它们共同承担数据和负载的压力
  • 主节点 负责管理集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点等。 而主节点并不需要涉及到文档级别的变更和搜索等操作,所以当集群只拥有一个主节点的情况下,即使流量的增加它也不会成为瓶颈
  • 从节点负责 文档变更和搜索

2、集群健康

  • GET /_cluster/health

3、添加索引

  • - 一个分片是一个底层工作的单元,保存了全部数据的一部分,分片的工作流程【待完成】
  • [ ]

4、添加故障转移

  • 启动另一个节点
  • 单播比组播效果好【默认单播,防止节点无意中加入集群】
    • 1、单播的含义是在同一台机器上开启一个节点,这个节点会自动添加到集群中,单播可以设置链接的节点列表,当一个节点联系到单播列表的成员时,会得到整个集群的状态且会通知master 加入集群
    • 2、组播的坏处 会偶然发现一个节点意外加入集群中,会导致一些错误的问题,收到错的组播信号导致的

5、水平扩容 && 故障应对

 如果主分片及副本在同一个节点的话,这个节点宕机,那是不是一定会出现问题。。TODO

三、搜索

1、文档元数据

 _index :因共同特性被分组到一起的文档集合是一个索引
 _type :对不同种类的数据进行区分,不同的types的文档可能有不同的字段,【好像是去掉了在后面的API中】
 _id :文档的主键ID

2、CRUD

  - 获取单个值
  GET /_index/_type/:id/_source =title,text
  
  - 新建
  POST /_index/_type 生成单一随机的ID
  {body:{}}
  PUT /_index/_type/:id/_create
  
  - 更新 [更新完的数据会将之前的数据标记删除,增加全新的文档,之前的文档不会消失,只是不会被访问到] 
  PUT /_index/_type/:id
  {body:{}}
  
  DELETE /_index/_type/:id

3、处理冲突

-  使用_version 进行处理,使用乐观锁实现
PUT /_index/_type/:id?version=num&version_type=external // 冲用之前的版本号

4、 更新文档 && 更新冲突

使用upsert 对不存在的文档进行处理Update &&insert
使用retry_on_conflict 自动完成对Update后的重试次数,默认为0 解决了操作数据无序的冲突
使用乐观锁实现最终一致性

5、MGET

 GET /_index/_type/_mget
 {
    "ids":["2","1"]
 }

6、批量操作

 一个好的批量大小在开始处理后所占用的物理大小约为 5-15 MB。
  

三、分布式文档存储

  • 1、路由从一个文档的到一个分片中
    • 路由函数实现分配到不同的分片 hash(routing)%number_of_primary_shards gorm的sharding - 2、 主分片和副本分片的交互

四、分布式检索

1、关键字
  • 这些查询经常用于某个字段有值的情况和某个字段缺值的情况。
    • match_all match_all 查询简单的匹配所有文档。在没有指定查询方式时,它是默认的查询
    • match: 在任何字段上进行的是全文搜索还是精确查询 在精确值的查询上,使用Filter 来取代query,filter 会被缓存
    • multi_match: 可以在多个字段上执相同的match查询
    • range查询L 查询制定字段的区间的值
    • term: 用于精确值匹配。,精确值可能是数字、时间、布尔、不需要分析的字符串
    • terms: 允许制定多值进行匹配
    • exists:查询用于查找字段中的值有无的文档, 【SQL 中的 IS_NULL ==missing|NOT _IS_NULL ==exists】
2、组合多查询
  • 使用bool查询实现多组合查询条件组合
    • must :必须匹配些条件
    • must_not: 必须不匹配这些条件
    • should: 满足某个条件即可,增加 _score的值
    • filter:必须匹配 ,但不评分
    • 增加带过滤器的查询 将数据的查询放到 filter 里面 , 不会有 评分 filter:{bool}
    • constant_score 查询 将一个不变的常量评分应用于所有的匹配的文档 ,适用于只需要执行一个filter而没有其他查询 可以取代只有fiter的 bool查询
3、 验证查询
  • validate/query 的验证
4、 排序
 - 字符串排序 给字符串添加一个fields 属性,分析器用于存储,not_anylyer 用于排序

分布式检索

 - 单个文档的唯一性由 _index,_type_id 组合决定的,

 - 在各个分片上找到文档 && 组合成单个排序列表 ,query and fetch
     - 查询将广播到每个分片拷贝上每个分片在本地执行搜索并构建一个匹配文档的优先队列
     
  ![elas_0901.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4290494f007e4281a4d8cdc26aaa0d7e~tplv-k3u1fbpfcp-watermark.image?)

查询阶段包含以下三个步骤:

1.  客户端发送一个 `search` 请求到 `Node 3` , `Node 3` 会创建一个大小为 `from + size` 的空优先队列。
2.  `Node 3` 将查询请求转发到索引的每个主分片或副本分片中。每个分片在本地执行查询并添加结果到大小为 `from + size` 的本地有序优先队列中。
3.  每个分片返回各自优先队列中所有文档的 ID 和排序值给协调节点,也就是 `Node 3` ,它合并这些值到自己的优先队列中来产生一个全局排序后的结果列表。  

 ![elas_0902.png](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/8c80bcc6419e45e7a2cd397b35b5b8cc~tplv-k3u1fbpfcp-watermark.image?)

分布式阶段由以下步骤构成:

   1.  协调节点辨别出哪些文档需要被取回并向相关的分片提交多个 `GET` 请求。
   2.  每个分片加载并 *丰富* 文档,如果有需要的话,接着返回文档给协调节点。
   3.  一旦所有的文档都被取回了,协调节点返回结果给客户端。  
5、搜索选项
   preference 可以指定,并防止Bounding Restults[https://www.elastic.co/guide/en/elasticsearch/reference/5.6/search-request-preference.html](url)
   timeOut : 每个分片处理数据的最大的时间,结果可以是部分或者空数据
  

五、分区、分片内部原理

六、同步 和布署

七 、ES的特性

1、随时可用 和按需扩容

  • 性能强大的ES 【纵向】
  • 扩机器【横向】

2、实现高可用实现方式

  • 副本分片,当主分片节点挂掉,一个副本分片会晋升为主分片

  • 索引写入时,新文档会先被索引进主分片然后同步到其他的所有的副本,增加副本不会增减索引容量

  • 副本分片 服务于读请求,偏向查询的索引,增加副本的数量提升查询性能

八、 部分底层原理

1、 基于FST(Finite State Transducer)数据结构

  • 释义:TODO

2、文档路由算法

3、倒排索引

  • 原理:

4、分析器

  • 分析的过程:
    • 将文本分成适合倒排索引的词条,之后将词条统一为标准化的格式可搜索型,recall 分析器执行
    • 字符过滤器
    • 分词器
    • token过滤器 会改变字符串的大小写 删除/增加字条,
  • 内置分析器
    • 标准分析器
    • 简单分析器
    • 空格分析器
    • 语言分析器

5、相似度算法:

-  检索词频率/反向文档频率, TF/IDF
-  检索词频率 :该词在字段中出现的频率,
-  反向文档频率: 检索词子在索引中出现的频率

Tips

1、设置多少分片合适

  • ES 默认为一个索引创建5个分片,并分别创建一个副本分片,
  • 分片及副本的分配是高可用急快速查询的设计核心
  • 在配置好索引后,在集群中无法调整分片设置了,因为文档的路由算法中重要的参数是分片数,【可以reindex】
  • 每个分片是一个Lucene 索引,会消耗相应的文件句柄、内存和CPU资源
  • 每个搜索都是需要调度索引的每个分片,分片和节点 分配均匀的话,影响不大,而竞争相同硬件资源,性能会下降
  • ES 会使用词频统计计算相关性,会影响相关性
  • 副本TODO
  • 后台清理文档的机制 TODO
  • versions的机制
  • 深度分页的BUG
  • 映射的数据类型关注