Elasticsearch 高频面试题及详细答案
一、基础概念篇1. 什么是 Elasticsearch核心优势是什么Elasticsearch 是一款基于 Lucene 开发的分布式、可扩展、实时的全文搜索引擎与数据分析引擎使用 Java 开发支持 RESTful API 操作是目前主流的日志检索、业务检索、大数据实时分析中间件。核心优势分布式架构天然支持集群部署支持横向扩容、高可用全文检索能力强支持分词、模糊查询、高亮、权重排序实时近实时数据写入后 1 秒左右可被检索NRT 近实时丰富的聚合分析支持桶聚合、指标聚合可快速做统计分析无 schema 灵活支持动态映射适配多变业务数据生态完善搭配 Kibana、Logstash、Beat 形成 ELK 日志栈2. ES、MySQL、Redis 的适用场景区别MySQL结构化数据、事务、增删改查、强一致性、业务主数据存储不适合海量模糊检索Redis热点数据缓存、分布式锁、计数器、限流纯内存高速读写不适合复杂全文检索ES海量数据全文检索、日志分析、实时统计、模糊匹配、分词检索不适合强事务、高频更新场景3. 什么是 NRT 近实时搜索为什么 ES 不是实时ES 写入数据后不会立刻对检索可见默认 1 秒刷新一次索引这个特性就是近实时搜索。原因ES 为了提升写入性能写入数据先写入内存缓冲区不会立刻落地磁盘只有执行refresh操作后缓冲区数据生成段文件才可以被检索。手动刷新可以设置 refreshtrue但会严重降低写入性能。二、核心架构与名词解释4. 讲解 ES 核心概念索引、类型、文档、分片、副本索引Index一类相似文档的集合相当于 MySQL 的数据库/表是数据存储的基本单元文档DocumentES 最小数据单元JSON 格式相当于 MySQL 一行数据字段Field文档中的属性相当于 MySQL 字段主分片Primary Shard索引数据拆分的分片负责读写、数据写入主分片数量创建后不可修改副本分片Replica Shard主分片的备份负责读请求、故障容灾副本数可以动态修改核心规则主分片和副本不会在同一台节点保证节点宕机不丢数据。5. 分片为什么不能修改分片数量如何合理设计主分片基于哈希取模路由数据公式shard hash(_id) % number_of_primary_shards。如果修改主分片数量所有数据路由规则全部失效数据彻底错乱因此主分片数固定不可改。分片设计原则单分片数据量建议控制在20G-50G最佳分片数量不宜过多过多会导致元数据压力大、查询变慢副本数至少 1保证高可用生产环境不允许 0 副本6. 什么是段Segment段合并的作用和问题ES 底层基于 Lucene 段文件存储数据每次 refresh 都会生成一个新的小段文件段文件是只读的。段合并后台线程将多个小段合并为大段删除已标记删除的数据减少段文件数量提升查询性能。缺点段合并会大量占用 CPU、IO、磁盘高峰期容易导致集群压力飙升引发查询卡顿。三、索引与映射机制7. 动态映射和静态映射区别生产推荐哪种动态映射自动根据写入 JSON 字段推断类型无需提前建表上手快但容易出现类型错乱数字变字符串、日期识别异常静态映射手动定义字段类型、分词器、是否索引、是否存储类型可控、性能稳定生产强制推荐静态映射避免动态映射导致的字段类型异常、检索失效问题。8. text 和 keyword 区别使用场景text会分词支持模糊检索、全文搜索不支持聚合、排序分词后多词条无法精准排序keyword不分词完整存储原文支持精准查询、聚合、排序、分组统计通用最佳实践字符串字段设置textkeyword 双字段搜索用 text聚合排序用 keyword。9. index、store 属性作用indextrue字段建立索引可以被检索默认开启indexfalse不建立索引无法搜索节省索引空间storetrue单独存储字段数据默认 false_source 已存储全量数据无需重复存储四、写入、更新、删除原理10. ES 数据写入完整流程客户端请求到达 coordinating node协调节点协调节点根据文档 _id 哈希路由定位目标主分片节点请求转发至主分片节点主分片执行写入、校验数据主分片同步数据到所有副本分片全部写入成功后返回响应给客户端数据先写内存缓冲区 translog 事务日志定时 refresh、flush 落盘11. ES 更新为什么是先删后写Lucene 段文件只读不可修改因此 ES 无法原地更新数据。更新时旧文档标记删除写入一条新文档段合并时彻底清理旧数据。因此 ES不适合高频更新业务频繁更新会产生大量删除标记、小段文件严重影响性能。12. translog 事务日志作用内存缓冲区数据未落地磁盘宕机就会丢失。translog 实时记录写入操作用于故障恢复。flush 操作会将内存数据写入磁盘清空 translog 日志完成持久化。五、检索与查询原理13. match 和 term 查询区别term精准匹配不分词直接匹配词条适合 keyword、数字、日期match会对查询语句分词再去索引匹配适合 text 全文检索常见坑text 字段用 term 查不到数据因为字段已分词词条和原文本不一致。14. 什么是倒排索引原理是什么倒排索引是 ES 检索的核心区别于正向索引文档→词条倒排索引是词条→文档的映射结构。结构词条字典 倒排记录表记录词条出现的文档、频次、位置。优势海量数据下根据关键词快速匹配文档检索效率远高于数据库模糊查询。15. bool 查询的四种逻辑must必须匹配参与算分filter必须匹配不参与算分、可缓存性能最高should可选匹配满足任意一个提升相关性得分must_not必须不匹配不参与算分优化原则过滤条件全部放 filter减少算分、利用缓存。六、聚合分析16. ES 常用聚合类型指标聚合Metricsum、avg、max、min、count、distinct_count 去重统计桶聚合Bucketterms 分组、date_histogram 时间直方图、range 区间分组聚合执行顺序先分桶、后算指标。17. terms 聚合精准度问题如何解决分布式聚合会出现数据近似误差每个分片独立统计合并结果会有偏差数据量大时 topN 不准。解决方案调高 size、shard_size 参数牺牲性能换取精准度极致精准使用 cardinality 或二次聚合。七、性能优化高频重点18. ES 写入优化方案批量写入使用 bulk 接口单次 1000-5000 条最佳调大刷新间隔index.refresh_interval 调至 3s-10s减少刷新次数关闭副本大批量初始化数据时临时设置副本数为 0写入完成再恢复合理分片单分片控制 50G 以内禁用动态映射提前建好静态 mapping19. ES 查询优化方案能 filter 不 must减少算分、开启查询缓存精准字段用 keyword避免 text 分词查询限制返回字段使用 _source 过滤不需要字段避免深分页fromsize 超大值改用 scroll / search_after合理设置分片避免分片过多20. 深分页问题解决方案fromsize 分页深度越深协调节点需要聚合所有分片大量数据、排序裁剪内存和 CPU 消耗极高会触发熔断报错。解决方案常规海量分页search_after推荐无状态、性能高一次性批量导出scroll 查询业务限制禁止前端超大深度分页八、集群与高可用21. 集群节点角色主节点Master负责集群管理、分片分配、元数据更新不负责数据读写数据节点Data负责数据存储、读写、聚合计算协调节点Coordinate接收请求、路由、结果合并无数据存储生产最佳实践分离主节点、数据节点避免主节点压力过大导致集群异常。22. 脑裂问题是什么如何解决网络波动导致集群分裂为两个子集群各自选举主节点数据分片错乱、集群数据不一致即为脑裂。解决方案设置discovery.zen.minimum_master_nodes (集群主节点数/2)1保证多数节点选举避免脑裂。新版 ES 已自动适配。九、常见故障与面试压轴题23. 索引变红、变黄原因黄色yellow主分片正常副本分片未分配节点不足、磁盘不足、分片数超限红色red存在主分片未分配数据无法读写索引异常不可用24. ES 磁盘爆满如何处理临时清理过期索引、关闭分片自动分配、临时调高磁盘水位根治开启索引生命周期 ILM自动删除过期日志索引扩容磁盘拆分大索引25. 为什么不建议用 ES 做实时事务业务无事务机制不支持 ACID更新是删除新增高频更新性能差近实时机制数据写入不能立刻查询分布式一致性弱不适合金融、订单等强一致场景