核心概念
ElasticSearch 是一个基于 Lucene 的分布式搜索和分析引擎,专为全文检索、日志分析、实时数据分析等场景设计。它与传统关系数据库(如 MySQL)在设计目标、数据模型、查询能力上有本质区别。
为什么使用 ElasticSearch
1. 全文检索能力强大
- 倒排索引:专为文本检索优化,支持分词、模糊匹配、相关性评分
- 多语言支持:内置多种语言分词器,支持中文分词(如 IK、jieba)
- MySQL 的
LIKE '%keyword%'无法使用索引,性能差
2. 近实时搜索
- 数据写入后 1 秒内(默认 refresh_interval)即可被搜索
- 适合实时日志分析、监控告警场景
3. 分布式架构
- 天然支持水平扩展,自动分片(Shard)和副本(Replica)
- 高可用性,节点故障自动恢复
4. 复杂查询和聚合
- 支持复杂的 Bool 查询、范围查询、地理位置查询
- 强大的聚合分析能力(类似 SQL 的 GROUP BY,但更灵活)
与 MySQL 的核心区别
| 维度 | ElasticSearch | MySQL |
|---|---|---|
| 数据模型 | 文档型(JSON)、Schema-free | 关系型、严格 Schema |
| 索引结构 | 倒排索引(全文检索) | B+Tree 索引(精确查询) |
| 查询能力 | 全文检索、模糊匹配、相关性评分 | 精确查询、JOIN、事务 |
| 事务支持 | 不支持 ACID 事务 | 完整 ACID 支持 |
| 写入性能 | 批量写入性能好,但有延迟 | 实时写入,强一致性 |
| 扩展性 | 天然分布式,易扩展 | 垂直扩展为主,分库分表复杂 |
| 适用场景 | 搜索、日志分析、BI | 交易系统、关系数据管理 |
典型使用场景
1. 站内搜索
// 商品搜索示例
SearchRequest searchRequest = new SearchRequest("products");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.multiMatchQuery("手机", "name", "description"));
sourceBuilder.aggregation(AggregationBuilders.terms("brands").field("brand.keyword"));
searchRequest.source(sourceBuilder);
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
2. 日志分析(ELK Stack)
- Elasticsearch 存储和检索日志
- Logstash 收集和转换日志
- Kibana 可视化展示
3. 实时数据分析
- 电商实时销售统计
- 用户行为分析
- APM(应用性能监控)
架构选型建议
使用 ElasticSearch 的场景
- 需要全文检索功能(商品搜索、文档检索)
- 日志存储和分析(ELK)
- 需要复杂聚合分析(数据大盘)
- 读多写少,对强一致性要求不高
使用 MySQL 的场景
- 需要事务保证(订单、支付)
- 关系复杂,需要 JOIN 操作
- 数据强一致性要求高
- 成熟的 CRUD 业务
典型组合方案
MySQL(主数据库)+ ElasticSearch(搜索引擎)
- MySQL 存储核心业务数据,保证事务和一致性
- 通过 Canal、Logstash、Flink CDC 等将数据同步到 ES
- ES 负责搜索、统计、分析功能
总结
ElasticSearch 不是用来替代 MySQL 的,而是解决 MySQL 不擅长的全文检索和大数据量实时分析问题。在实际项目中,通常采用 MySQL + ElasticSearch 组合,MySQL 作为主数据存储保证数据一致性和事务,ES 作为搜索引擎提供高性能检索和分析能力。
面试要点:
- 突出倒排索引和全文检索优势
- 对比与 MySQL 在数据模型、事务、扩展性上的差异
- 说明典型的组合使用方案(MySQL + ES 双写或 CDC 同步)