高频关于es的一些面试题及答案_第1页
高频关于es的一些面试题及答案_第2页
高频关于es的一些面试题及答案_第3页
高频关于es的一些面试题及答案_第4页
高频关于es的一些面试题及答案_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

高频关于es的一些面试题及答案ES(Elasticsearch)作为分布式搜索与分析引擎,在企业级数据处理中应用广泛,面试中常围绕核心概念、集群管理、索引设计、查询优化及故障排查展开。以下是常见问题及详细解答:1.倒排索引的核心结构是什么?与传统数据库索引的区别在哪里?倒排索引的核心由两部分组成:词典(TermDictionary)和倒排列表(PostingList)。词典存储所有不重复的词项(Term),并记录其对应的倒排列表位置;倒排列表包含词项出现的文档ID、词频(TermFrequency)、位置(Position)等信息。与传统数据库的B+树索引不同,倒排索引以“词”为中心,适合全文检索,能快速定位包含特定词的文档;而B+树索引以“记录”为中心,适合等值或范围查询,但对多词组合的全文检索效率较低。例如,查找“快速入门”相关文档时,倒排索引可分别查找“快速”和“入门”的倒排列表,取交集后排序,而传统索引需逐行扫描。2.分片(Shard)和副本(Replica)的作用是什么?生产环境中如何设置分片数量?分片是ES水平扩展的核心机制,将大索引拆分为多个小索引分布在不同节点,实现负载均衡与并行查询。副本是分片的冗余拷贝,用于高可用(主分片故障时提升副本为主分片)和读请求分流(客户端可从任意副本读取数据)。生产环境分片数量设置需权衡:单分片大小建议控制在10GB-50GB(过大影响恢复速度,过小增加集群管理开销);初始分片数需提前规划(ES7.x后默认主分片数为1,需手动设置),因分片无法动态扩容(需通过Reindex或RolloverAPI重建);集群节点数与分片数匹配(如3节点集群,主分片数建议3,每个节点存1个主分片,副本数建议1,总分片数6);时间序列数据(如日志)可按时间创建索引(如log-2024-01),每索引1-3个分片,通过ILM(索引生命周期管理)自动滚动。3.集群状态(ClusterState)的红、黄、绿分别代表什么?如何排查黄色状态?绿色:所有主分片和副本分片均正常分配;黄色:所有主分片正常,但至少1个副本分片未分配(可能因节点不足、磁盘空间不足或副本分片所在节点故障);红色:至少1个主分片未分配(数据部分丢失,需紧急修复)。排查黄色状态步骤:①使用`GET/_cat/shards?v`查看未分配分片的索引、分片ID及状态(UNASSIGNED);②检查`GET/_cluster/allocation/explain`获取未分配原因(常见原因为磁盘水位线超标:ES默认当磁盘使用率超90%时拒绝分配分片,超95%时标记为只读);③若因节点不足,需扩容节点或调整副本数(如临时将副本数从2调为1);④若因磁盘问题,清理冗余数据或扩容磁盘,调整`cluster.routing.allocation.disk.watermark.low`等参数。4.什么是Mapping?动态映射(DynamicMapping)的规则是什么?如何禁用动态映射?Mapping定义索引的字段类型(如text、keyword、date)、分词器(Analyzer)、是否索引(index)等元数据,类似关系型数据库的Schema。动态映射是ES自动识别新字段类型的机制,规则如下:字符串:若包含空格或长度超32,默认映射为text(分词)+keyword(未分词,子字段);否则映射为keyword;数字:按`long→integer→short→byte→double→float`顺序自动识别;布尔值:映射为boolean;日期:尝试解析常见日期格式(如yyyy-MM-dd),映射为date;对象:映射为object类型,嵌套对象映射为nested类型(需显式设置)。禁用动态映射需在创建索引时设置`"dynamic":"strict"`(严格模式,新增字段会报错)或`"dynamic":"false"`(忽略新增字段),例如:```jsonPUT/my_index{"mappings":{"dynamic":"strict","properties":{"title":{"type":"text"}}}}```5.Term查询和Match查询的区别是什么?何时使用布尔查询(BoolQuery)?Term查询是精确匹配,直接查找倒排索引中的词项(Term),不进行分词(如查询`"type":"text"`字段的“快速”,需先分词再匹配)。Match查询是全文检索,会对查询内容先分词,再根据分词结果执行OR逻辑(默认),并计算相关性分数(_score)。例如,查询“快速学习ES”时,Match会分词为“快速”“学习”“ES”,匹配包含任意词的文档;Term需明确输入分词后的词项(如“快速”)才能匹配。布尔查询用于组合多个子查询,支持四种子句:must(必须满足,贡献_score);should(至少满足一个,贡献_score,当无must时默认至少满足一个);filter(必须满足,不计算_score,结果可缓存);must_not(必须不满足,不计算_score)。典型场景:查询“2024年发布且标题包含‘ES’或‘搜索’的技术文档”,可用must包裹filter(日期范围)和should(标题匹配)。6.如何实现高亮显示(Highlighting)?需要注意哪些问题?高亮通过在查询中配置`highlight`参数实现,ES会将匹配的词项用`<em>`标签(可自定义)包裹返回。示例:```jsonGET/my_index/_search{"query":{"match":{"content":"Elasticsearch"}},"highlight":{"fields":{"content":{}},"pre_tags":["<strong>"],"post_tags":["</strong>"]}}```注意事项:仅对`text`类型字段生效(keyword需设置`fielddata:true`,但不推荐);高亮片段长度默认100字符,可通过`fragment_size`调整;多词匹配时,`number_of_fragments`控制返回片段数;高亮依赖分词结果,需确保查询分词与索引分词一致(如使用相同Analyzer);高亮会增加CPU和内存消耗,大结果集查询需谨慎使用。7.深度分页(DeepPagination)的问题是什么?如何解决?深度分页指通过`from`和`size`参数翻页到数万页后,查询性能急剧下降。原因:ES需在所有分片上查询前`from+size`条数据,合并后取最后`size`条,导致网络和内存开销随`from`增大呈指数级增长(如10000页,每页10条,需查询100010条数据)。解决方案:游标查询(ScrollAPI):首次查询提供游标(ScrollID),后续通过游标分页,避免重复排序(适合离线导出数据,但游标有效期内数据变更无法感知);搜索后翻页(SearchAfter):基于上一页最后一条文档的排序值分页(需指定唯一排序字段,如`_doc`或时间戳),性能稳定(适合实时分页);示例(SearchAfter):```jsonGET/my_index/_search{"size":10,"sort":["@timestamp","_doc"],"search_after":[1714569600000,"dXNlcl9pZA=="]}```8.聚合(Aggregation)的核心概念是什么?常见的聚合类型有哪些?聚合是对数据分组统计的能力,由“桶(Bucket)”和“指标(Metric)”组成。桶定义分组规则(如按`category`字段分组),指标对每个桶内的数据计算统计值(如求和、平均)。常见聚合类型:桶聚合(Bucket):术语聚合(TermsAggregation):按字段值分组(如统计各标签的文档数);范围聚合(RangeAggregation):按数值或日期范围分组(如销售额0-1000、1000-5000);日期直方图(DateHistogram):按时间间隔分组(如每日、每月的文档数);指标聚合(Metric):统计聚合(StatsAggregation):计算计数、总和、均值、最大值、最小值;百分位数(Percentiles):计算数据分布的百分位值(如响应时间的95%分位);矩阵聚合(MatrixAggregation):多字段间的统计(如计算字段A和字段B的相关性)。注意:深度聚合(如百万级数据的Terms聚合)会占用大量内存,需限制`size`参数或使用`execution_hint:map`(在各分片本地聚合后合并)。9.如何优化ES的写入性能?写入优化需从索引设计、API使用、集群配置三方面入手:索引设计:减少分片数(过多分片增加集群管理开销),单分片大小建议10GB-50GB;降低副本数(写入时需同步到副本,生产环境可临时设为0,写入完成后恢复);禁用不必要的字段(如`_source`可设置`includes`仅存储必要字段,`_all`字段默认禁用);使用`refresh_interval`控制刷新频率(默认1秒,批量写入时可设为30秒或-1,完成后恢复);API使用:批量写入(BulkAPI):将多个`index`/`create`操作合并为一个请求(建议单批次10-20MB,约5000-10000条);异步写入:通过Logstash或Flink等工具缓冲数据,减少单节点写入压力;禁用路由(Routing):若无需自定义路由,避免指定`_routing`字段(需所有分片参与写入);集群配置:提升节点硬件(如SSD磁盘加速数据持久化,大内存减少GC频率);调整`indices.memory.index_buffer_size`(默认JVM堆的10%,大写入场景可增至30%);关闭自动提供ID(`_id`由业务端提供,减少ES随机写操作)。10.集群脑裂(SplitBrain)的原因是什么?如何预防?脑裂指集群因网络分区,导致部分节点认为原Master失效,重新选举新Master,形成两个独立集群。原因:网络延迟或中断导致节点间心跳(Ping)超时(默认3秒),且未设置最小主节点数(`discovery.zen.minimum_master_nodes`)。预防措施:设置`discovery.zen.minimum_master_nodes`(推荐值为`(mastereligiblenodes/2)+1`,如3个Master候选节点,设为2),避免少数节点自行选举;使用更可靠的网络(如万兆网)或部署跨可用区集群(减少网络分区概率);升级至ES7.x+(默认使用Election策略,替代ZenDiscovery,降低脑裂风险);监控集群状态(通过Kibana或Prometheus+Grafana,及时发现网络延迟或节点异常)。11.如何排查慢查询?常见的慢查询原因有哪些?排查步骤:①启用慢查询日志(在`elasticsearch.yml`中设置`index.search.slowlog.threshold.query.warn:10s`等阈值),查看`logs/elasticsearch_slowlog.log`;②使用`profile`参数分析查询耗时(`GET/_search?profile=true`),定位是查询阶段(QueryPhase)还是_fetch阶段耗时;③检查查询是否包含高消耗操作(如通配符``开头、正则表达式、大聚合)。常见原因:深度分页(`from+size`过大);复杂布尔查询(多层嵌套的must/should);大聚合(如无`size`限制的Terms聚合);未分词字段的Match查询(如对keyword字段使用Match,导致全量扫描);未使用Filter上下文(将过滤条件放在Query上下文,重复计算_score且无法缓存);字段未索引(`index:false`的字段无法被查询,需扫描`_source`)。12.如何实现冷热数据分离?需要哪些工具支持?冷热数据分离将高频访问的“热数据”存储在高性能节点(如SSD、大内存),低频“冷数据”存储在低成本节点(如HDD),降低成本并提升热数据查询性能。实现步骤:①为节点打标签(如`node.attr.data:hot`或`cold`);②创建索引时指定路由规则(通过`index.routing.allocation.include.data:hot`将索引分配到热节点);③使用ILM(索引生命周期管理)自动滚动索引:热阶段(HotPhase):启用完整副本,高刷新频率;温阶段(WarmPhase):降低副本数,迁移至温节点(如`index.routing.allocation.include.data:warm`);冷阶段(ColdPhase):只读,迁移至冷节点;冻结阶段(FrozenPhase):压缩索引,减少内存占用;删除阶段(DeletePhase):过期数据自动删除。工具支持:Kibana的ILM界面、`_ilm`API(如`PUT/_ilm/policy/log_policy`定义策略)、节点属性配置(`elasticsearch.yml`中`node.attr.data:hot`)。13.数据丢失的可能原因有哪些?如何预防?可能原因:主分片和所有副本分片同时故障(如节点硬件损坏且无副本);错误执行`_delete_by_query`或`_bulk`操作(未确认条件导致数据误删);集群脑裂后合并数据(两个集群同时写入,未冲突的数据可能丢失);磁盘损坏导致分片无法恢复(未及时做快照)。预防措施:合理设置副本数(至少1个副本,关键数据设为2);定期创建快照(通过`_snapshot`API备份到云存储或共享文件系统,如AWSS3、HDFS);启用写前日志(Translog):`index.translog.durability:request`(每个写操作强制刷盘,保障数据持久化);操作前备份(如执行`_delete_by_query`前先创建快照或使用`wait_for_completion:false`异步执行,便于终止);监控Translog状态(`GET/_cat/translog?v`,避免Translog过大导致恢复时间过长)。14.如何优化模糊查询(FuzzyQuery)的性能?模糊查询通过编辑距离(LevenshteinDistance)匹配相似词项,默认允许1-2个字符

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论