ElasticSearch基础知识
字数 2040 2025-08-10 19:49:11
ElasticSearch 基础知识详解
1. ElasticSearch 概述
ElasticSearch(简称ES)是一个分布式、可扩展、实时的搜索与数据分析引擎。它不仅支持全文搜索,还支持:
- 结构化搜索
- 数据分析
- 复杂的语言处理
- 地理位置查询
- 对象间关联关系
底层技术:ES基于Lucene构建,Lucene是最先进、高性能、全功能的搜索引擎库。ES通过提供简单的RESTful API隐藏了Lucene的复杂性。
2. ES 核心特点
- 分布式实时文档存储:每个字段都可被索引与搜索
- 实时分析搜索引擎:支持各种查询和聚合操作
- 高度可扩展:能胜任上百个服务节点,支持PB级数据
- 高性能:面对海量数据时搜索速度极快
- 开箱即用的集群功能
3. 为什么选择 ElasticSearch
3.1 与传统数据库对比
MySQL/Oracle的问题:
- 大数据量高并发下性能下降
- 分表分库实现复杂,维护成本高
- 表结构更改困难
- Oracle费用昂贵
Redis/HBase的问题:
- Redis适合缓存,但数据结构简单(键值对),不支持复杂查询
- HBase适合海量数据存储,但实时分析和在线分析困难
3.2 ES 优势场景
适合使用ES的数据类型:
- 日志数据(支持关键字查询和可视化分析)
- 指标数据(实时监控、报警)
- 需要全文检索、聚合分析、可视化的场景
ES提供完整解决方案:
- 数据获取:Logstash、Beat
- 存储计算:ElasticSearch
- 展示分析:Kibana
- 扩展功能:X-Pack(安全、告警、监控、ML)
4. ElasticSearch 核心概念
4.1 集群与节点
- 集群(Cluster):由一个或多个节点组成的拓扑网络,通过集群名称区分
- 节点(Node):单个ES实例,分为:
- 主节点:管理集群状态
- 数据节点:提供数据服务
4.2 索引与文档
- 索引(Index):一组文档的集合(类似数据库中的表)
- 文档(Document):一条记录,以JSON格式存储
- 字段(Field):文档中的信息域,可控制是否存储和索引
4.3 分片与副本
- 分片(Shard):索引被分割的部分,分布在不同节点
- 主分片:处理写入和搜索
- 副本分片:保障高可用,参与搜索
- 默认配置:每个索引5个主分片,每个主分片1个副本
分片设计建议:
- 单个分片最大文档数20亿
- 推荐最大JVM堆空间30-32GB,因此分片最大容量限制为30GB
- 过早分片是"万恶之源",应根据数据增长趋势合理规划
4.4 段与分词
- 段(Segment):每个分片包含多个段,每个段都是倒排索引
- 不可变,删除操作通过标记实现
- 段合并时真正删除数据
- 段越多,搜索性能越低,内存消耗越大
- 分词(Term):搜索最小单位,由字段文本产生
- 词条(Token):分词过程中记录分词信息的对象
5. ElasticSearch 与 MySQL 概念对比
| MySQL | ElasticSearch |
|---|---|
| 数据库 | 索引(Index) |
| 表 | 类型(Type) |
| 行 | 文档(Document) |
| 列(Columns) | 字段(Fields) |
6. Lucene 核心知识
6.1 Lucene 概述
Lucene是Apache的开源全文检索引擎工具包,提供:
- 完整的查询引擎和索引引擎
- 部分文本分析引擎
- 不是完整应用,而是为应用提供索引和搜索功能
6.2 Lucene 特性
-
高性能索引:
- 每小时可索引150GB+数据
- 只需1MB堆内存
- 增量索引和批量索引速度相同
- 索引大小约为文本大小的20-30%
-
高效搜索算法:
- 支持短语查询、通配符查询、范围查询等
- 支持字段搜索、任意字段排序
- 支持多索引查询结果合并
- 支持高亮、join、分组
-
跨平台:
- 纯Java编写
- 有多种语言实现版(C, C++, Python等)
6.3 Lucene 索引流程
- 获取内容:通过爬虫或程序获取原始内容
- 建立文档:将内容转换为文档(包含多个域)
- 文档分析:将文本分割成语汇单元
- 文档索引:将文档加入索引列表
6.4 Lucene 搜索组件
- 建立查询:用户输入查询短语并提交
- 搜索查询:检索索引并返回匹配文档
- 展现结果:前端展示搜索结果
7. 实际应用建议
-
分片规划:
- 根据数据量增长趋势设计
- 避免过度分片(每个分片都有额外成本)
- 运行中无法调整分片数量,需重建索引
-
性能优化:
- 控制段数量(影响搜索性能和内存)
- 合理设计字段的存储和索引属性
-
适用场景:
- 日志分析
- 实时监控
- 全文检索
- 复杂聚合分析
-
生态系统:
- 结合Logstash(数据采集)
- 使用Kibana(可视化)
- 考虑X-Pack(安全、监控等高级功能)