CC 咖啡猫的工作空间 Coding Space
  1. es和MySQL模糊查询的本质区别:es查询索引(倒排索引,根据关键词映射文档ID),mysql是扫描全表(正排索引:已知文档ID,查询它包含哪些词)

  2. 核心概念

  • 索引(Index):逻辑上和关系型数据库的”数据库“,物理上由多个分片组成,支持按时间/业务滚动创建
  • 分片(Shard):索引的物理拆分单元,分为主分片和副本分片。分片分布在集群节点上,住分片处理写入,副本提升读取性能与容错性
  • 文档(Document):最小数据单元,以JSON格式存储,包含多个字段(Field,字段类型的定义Mapping),每个文档有唯一ID(自动或手动生成)、Type文档类型
  • Node节点:ES实例,按角色分为主节点(管理集群元数据)、数据节点(存储数据并处理CRUD,搜索和聚合)、协调节点(分发请求)
  1. 倒排索引(词项->文档的反向映射)
  • 词典:存储结构采用FST(有限状态转换器)来压缩存储排序后的词项,共享前缀/后缀减少内存占用(作用:快速定位词项对应的倒排列表,支持前缀匹配、范围查询)。
  • 倒排列表:包含文档ID、词频(TF,词项在文档中出现次数)、位置(Position,词项在文档中的位置,用于短语查询)、偏移量(Offset,用于结果高亮)。通过差值压缩(FOR算法)存储文档ID差值,VInt编码压缩位置信息,大幅减少存储空间。
  1. 分词器(将文本转换为词项,是影响检索召回率和准确性的关键。注意:索引时分词器和搜索时分词器必须一致,否则会导致检索不到结果)
  • Tokenizer:拆分文本为原始词项(分词)
  • TokenFilter:标准化处理(过滤停用词、转小写、词干提取)
  • CharFilter:预处理字符(如替换特殊符号)
  1. 节点角色
  • 主节点:管理集群状态(如索引创建、分片的分配),不处理文档读写
  • 数据节点:存储数据并处理CRUD、搜索和聚合(对结果做统计分析)
  • 协调节点:接收客户端请求,转发到数据节点并汇总结果
  • 候选主节点:参与主节点的选举
  1. 写入流程(主片先行,副本同步确认):
  • 路由计算:客户端请求协调节点,,协调节点确定通过计算(shard=hash(_routing) % primary_shard_count,routing默认是文档ID)确定目标分片
  • 写入与同步:数据先写入主节点的内存缓冲区(写入translog和内存缓冲区?),同时记录到事务日志确保数据不丢失。主分片完成本地写入后,会并行向所有副本分片发送数据变更请求,主分片将数据同步到所有副本分片,副本确认后返回成功(副本同步:即副本分片执行与主分片相同的写入流程,何时返回成功根据配置决定)。
  • 近实时可见:默认每秒执行一次refresh,将内存缓冲区数据写入文件系统缓存
  • 持久化:Translog默认每30分钟或者达到512MB时,触发Flush,将缓存数据写入磁盘并生成新段,旧的Translog被删除
  1. 搜索流程(分为两个阶段,确保结果准确且高效)
  • Query阶段:协调节点广播查询请求到所有分片 -> 分片在本地执行执行查询并返回文档ID和排序值 -> 协调节点合并结果并生成全局排序列表。
  • Fetch阶段:协调节点根据文档ID,向对应的分片请求完成数据,汇总后返回给客户端。若需要更准确的相关性平分,可使用DFS Query Then Fetch(预查询词频和文档频率)
  1. 更新与删除:ES不可修改,更新是标记旧文档为删除(.del文件)并写入新版本;删除仅标记状态,实际的删除在段合并时进行

  2. 集群管理与高可用

  • Master节点选举:候选节点通过单播、候选节点按ID字典排序,得票树超过半数且自身投票的节点成为主节点。
  • 防脑裂(因网络分区导致多个主节点出现):确保mininum_master_nodes设置正确、避免跨数据中心部署,减少网络波动影响
  • 故障转移:节点宕机后,集群自动将该节点上的主分片副本升级为主分片,重新分配副本,无需人工干预。
  1. 性能优化
  • 索引设计:滚动索引(按时间创建索引,通过Rollover API自动滚动,避免单索引过大)、冷热分离(冷数据压缩存储)、Mapping优化(仅对需要检索的字段启用index:true,高频精确匹配字段用keyword类型,全文检索用text类型并选择合适的分词器)
  • 写入调优:批量写入(减少网络开销)、减少副本(初始化写入时关闭副本,写入完成后恢复副本)、使用自动ID(避免手动指定ID导致版本冲突,增加开销)
  • 查询优化:避免深度分页、禁用通配符查询(*keyword会导致全表扫描,改用前缀查询)、路由查询(指定routing参数,减少分片扫描范围)、利用Filter缓存(精确匹配、范围查询使用Filter,结果可缓存,性能高于Query)
  • 系统优化:内存设置、关闭swap(防止内存交换导致性能雪崩)、文件描述符(设置ulimit -n 65536,支持大量文件句柄)
  1. 面试问题:
  2. 倒排索引与B+树的区别:倒排索引适合全文检索(词项→文档),B+树适合精确匹配(键→值)。
  3. 为什么ES是近实时:数据写入后需等待Refresh(默认1秒)才能被检索,而非实时可见。
  4. 如何解决脑裂:候选节点≥3时设置minimum_master_nodes = (n/2)+1,候选节点=2时改为1主1数据节点。
  5. text与keyword的区别:text会分词,适合全文检索;keyword不分词,适合精确匹配和聚合。