面试题答案
一键面试1. 倒排索引和文档存储机制基础
- 倒排索引:Elasticsearch 将文档中的每个词项映射到包含该词项的文档列表,这个列表包含文档 ID 及词项在文档中的位置等信息。通过倒排索引,能快速定位到包含特定词项的文档。
- 文档存储:文档以 JSON 格式存储在分片上,每个分片是一个独立的 Lucene 索引。主分片负责数据的写入和初始存储,副本分片用于提供高可用性和读取负载均衡。
2. 聚合操作参数分析
- size
- 原理:用于指定聚合结果返回的最大桶(bucket)数量。在聚合计算时,每个分片会计算出本地的聚合结果,包含多个桶。size 参数限制了最终返回给客户端的桶的数量。
- 兼容性:在不同分片数量下,每个分片都会根据自身数据计算聚合结果。如果分片数量多,每个分片数据量相对少,但所有分片聚合结果汇总后,若不限制 size,可能返回大量桶,消耗网络和客户端资源。在文档分布不均匀时,可能某些分片产生大量有意义的桶,size 限制可能导致重要信息丢失。数据量规模大时,限制 size 可有效减少传输数据量。
- 优化:根据业务需求确定合理的 size。如果只关心前 N 个热门数据,设置合适的 size 为 N。若需要全面分析,可先设置较大 size 进行探索性分析,再根据结果调整。
- shard_size
- 原理:每个分片在计算聚合时,会基于本地数据生成桶。shard_size 决定了每个分片上保留的桶的最大数量。它用于在分片层面筛选桶,然后再将这些桶合并到协调节点生成最终结果。
- 兼容性:分片数量多,每个分片数据量少,shard_size 较小时,可能导致有价值的桶在分片层面就被丢弃,影响最终结果。文档分布不均匀时,某些分片数据量大,shard_size 需适当增大以保证重要桶不丢失。数据量规模大时,较大的 shard_size 会增加分片计算和内存消耗。
- 优化:一般建议 shard_size 大于 size,以确保最终结果包含足够多的有价值桶。同时根据分片数据量和预期聚合结果的复杂程度调整,数据量越大、聚合越复杂,shard_size 应适当增大。
- min_doc_count
- 原理:用于过滤掉文档数量低于指定值的桶。在聚合计算时,每个桶都会统计包含的文档数量,只有文档数量大于或等于 min_doc_count 的桶才会被保留。
- 兼容性:在不同分片数量下,若分片数据量小,min_doc_count 设置过高,可能导致大部分桶被过滤,聚合结果无意义。文档分布不均匀时,可能某些分片上符合 min_doc_count 的桶少,影响最终聚合结果的全面性。数据量规模大时,可有效过滤掉噪声桶。
- 优化:根据业务对数据的要求设置。如果关注高频数据,可适当提高 min_doc_count 过滤低频数据;若需全面分析,应设置较低值或 0。
3. 根据实际场景优化
- 分片数量少、文档分布均匀、数据量小:size 可根据需求设置常规值,shard_size 略大于 size 即可,min_doc_count 可设为 0 或较小值以获取全面结果。
- 分片数量多、文档分布均匀、数据量小:size 按需设置,shard_size 适当增大以防止分片层面丢失重要桶,min_doc_count 同样可设为 0 或较小值。
- 分片数量少、文档分布不均匀、数据量小:分析数据分布,适当增大 shard_size 保证重要分片的桶不丢失,size 根据业务需求确定,min_doc_count 根据是否关注低频数据调整。
- 分片数量多、文档分布不均匀、数据量小:shard_size 需大幅增大,size 按需设置,min_doc_count 综合业务对低频数据的需求设定。
- 数据量规模大:size 严格按需设置以减少传输量,shard_size 根据分片数据量和聚合复杂程度调大,min_doc_count 适当提高过滤噪声桶。同时,结合监控数据不断调整这些参数,以达到最佳性能和兼容性。