《Elasticsearch 实战》笔记
2024/11/5大约 7 分钟
《Elasticsearch 实战》笔记
《Elasticsearch 实战》 学习笔记
第 1 章 Elasticsearch 介绍
- 基于 Apache Lucene 的开源分布式搜索引擎
- 常见用途:索引大规模数据,支持全文搜索和实时数据统计
- 特性超越全文搜索:可调优搜索相关性、提供搜索建议
- 所有操作(索引、搜索、管理)通过 HTTP JSON API 交互
- 可作为 NoSQL 数据存储,具备实时搜索和分析能力,面向文档、天然可扩展
- 自动将数据划分为分片,在集群节点间负载均衡,支持动态扩缩容;分片可复制,提供容错性
第 2 章 深入功能
- 默认面向文档、可扩展、无固定 schema
- 集群配置至少应调整集群名称和堆大小
- 写请求在主分片分发,再复制到副本分片
- 搜索在多组分片上轮询执行,接收节点聚合部分结果后返回综合结果
- 通过 HTTP JSON 请求/响应交互
第 3 章 索引、更新和删除数据
- 映射(Mapping):定义文档字段及索引方式;ES 无模式因映射自动扩展,但生产环境需主动控制
- 多数字段为核心类型(字符串、数值),索引方式直接影响性能和搜索相关性
- 单一字段可包含多值:数组和多字段支持同一类型的多个实例
- 预定义字段如
_source、_all,影响性能和功能(如控制_all索引范围) - 更新文档 = 检索旧文档 + 索引新文档 + 删除旧索引(因 Lucene 分段不可变)
- 删除整个索引 > 删除单个文档(只需移除文件,无需合并分段)
- 可用文档版本管理并发,更新失败时可配置自动重试
第 4 章 搜索数据
match和query_string查询适合人类语言查询(搜索框场景)match是全文搜索核心类型;query_string更灵活,暴露完整 Lucene 查询语法match子类型:boolean(匹配单独关键词)、phrase(考虑词组顺序)、phrase_prefix- 支持
prefix、wildcard等特殊查询 missing过滤器:过滤字段不存在的文档;exists过滤器:只返回有指定字段值的文档
第 5 章 分析数据
- 分析:将字段文本生成为分词的过程;搜索时查询字符串经历同样过程,分词匹配则搜索匹配
- 每个字段通过映射分配分析器(配置定义或使用默认)
- 分析器 = 字符过滤器(前置) + 分词器 + 分词过滤器(后置)
- 字符过滤器:分词前处理字符串(如
&→and) - 分词器:切分字符串为分词(如空白分词器按空格划分)
- 分词过滤器:处理分词器产出的分词(如词干提取,使搜索匹配单复数形式)
- N 元语法分词过滤器:用单词部分生成分词,适用于拼写错误容错
- 侧边 N 元语法:只从词头或词尾生成(如
event→e、ev、eve) - 滑动窗口分词过滤器:词组级别,用连续单词生成分词,提升多词匹配相关性
第 6 章 使用相关性进行搜索
- 词条频率和词条出现次数用于计算查询得分
- ES 提供多种工具定制和修改得分
- 重新计算部分文档得分可减小评分机制影响
- 使用解释 API 理解文档评分过程
function_score查询提供对文档得分的最终控制权- 理解字段数据缓存有助于掌握集群内存使用;消耗过多时可用
doc_values替代
第 7 章 使用聚集探索数据
- 聚集通过词条计数和统计值计算,提供查询结果概览
- 聚集是 ES 中更强大的切面形式,类型丰富且可组合
- 两大类:桶型聚集和度量型聚集
- 度量型聚集:计算文档组统计值(最小值、最大值、平均值等);部分使用近似算法(如
percentiles、cardinality),扩展性更好 - 桶型聚集:将文档分桶并返回计数;支持嵌套子聚集(如获取论坛最热帖子的平均评论数)
top_hits聚集可作子聚集实现结果分组terms聚集:发现活跃用户、热门物品等;significant_terms返回查询结果中相对全局索引的频繁词range/date_range:数值和日期分类;histogram/date_histogram:使用固定间距分类- 单桶型聚集(
global、filter、filters、missing):修改其他聚集的文档集合
第 8 章 文档间的关系
- 对象映射:处理一对一关系(最适用)
- 嵌套文档 / 父子结构:处理一对多关系
- 反规范化 / 应用端连接:处理多对多关系(最有帮助)
连接操作损害性能,应尽量将相关属性放入单个文档。对象映射允许文档内层级结构,搜索和聚集在扁平结构上运作,需用全路径引用字段(如 location.name)。
- 嵌套文档:索引时连接,将多个 Lucene 文档放入单个分块,对外表现为一篇 ES 文档
_parent字段:同索引中文档指向父辈(另一类型文档),ES 通过路由确保父子存储在同一分片,连接仅需本地执行
搜索嵌套和父子文档的查询/过滤器:
nested查询和过滤器has_child查询和过滤器has_parent查询和过滤器
第 9 章 向外扩展
- 集群结构:集群 → 节点 → 索引 → 分片
- 节点加入集群的过程
- 主节点选举机制
- 删除和停用节点
_catAPI 查看集群状态- 过度分片问题及集群成长规划
- 使用别名和路由提升灵活性和可扩展性
第 10 章 提升性能
bulkAPI:合并多个 index/create/update/delete 操作到同一请求multi-get/multi-search:分别组合多个 get 或 search 请求- 冲刷(flush):索引缓冲区满、事务日志过大或超时时,将内存 Lucene 分段提交到磁盘
- 刷新(refresh):使新分段可搜索;索引密集时应降低刷新频率或关闭
- 合并策略:较少分段 → 搜索更快但合并耗 CPU;较多分段 → 索引更快但搜索变慢
optimize操作:强制合并,适用于静态索引- 存储限流可能导致合并落后;有高速 I/O 时可放宽限制
- 组合使用
bool过滤器中的位集合过滤器和非位集合过滤器 - 静态索引可在分片查询缓存中缓存聚合结果
- 监控 JVM 堆使用,预留内存避免频繁 GC/OOM,同时给 OS 缓存留内存
- 首次查询慢且不介意较慢索引时,使用索引预热器
- 空间充足时,用 N 元语法/滑动窗口代替模糊/通配/词组查询,搜索更快
- 索引前创建好所需字段,避免使用脚本
- 脚本中优先使用 Lucene 表达式、词条统计和字段数据;不常变的脚本可写成本地插件
- 分片间文档频率不均衡时,使用
dfs_query_then_fetch - 不需命中文档时用
count搜索类型;需大量命中时用scan
第 11 章 管理集群
- 默认映射:为索引中重复的相似映射创建提供便利
- 别名:允许单个名字查询多个索引,支持按需分割数据
- 集群健康 API:测量集群、节点、分片的整体健康状态
- 慢索引/慢查询日志:诊断影响性能的索引和查询操作
- 理解 JVM、Lucene、ES 的内存分配,预防 OS 将进程交换到磁盘
- 快照 API:通过
repository-*插件扩展到云服务,提供便捷备份和恢复