核心概念

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 同步)