Elasticsearch重点
1. 什么是Elasticsearch?它的主要特点是什么?
答案: Elasticsearch是一个基于Lucene构建的开源、分布式、RESTful搜索引擎。主要特点包括:
分布式架构,支持水平扩展
近实时(NRT)搜索能力
多租户支持,通过索引隔离数据
强大的全文搜索能力
支持结构化查询和非结构化查询
RESTful API接口
支持多种语言客户端(包括Java)
2. 解释Elasticsearch中的索引(Index)、文档(Document)和分片(Shard)概念
答案:
索引(Index):类似传统数据库中的"数据库",是文档的集合
文档(Document):索引中的基本数据单元,使用JSON格式表示
分片(Shard):索引被分割成的部分,每个分片本身是一个功能完整的"索引"
主分片(Primary Shard):处理索引和查询请求
副本分片(Replica Shard):主分片的拷贝,提供故障转移和高可用性
3. Elasticsearch为什么比传统数据库搜索快?
答案: Elasticsearch搜索速度快的主要原因:
使用倒排索引结构,快速定位包含查询词的文档
所有数据默认被索引,适合搜索场景
分布式架构可以并行处理查询
数据存储在内存中(文件系统缓存)而不是磁盘
使用高效的数据压缩算法
避免了传统数据库的ACID特性带来的开销
4. 什么是倒排索引?它是如何工作的?
答案: 倒排索引是Elasticsearch的核心数据结构,由两部分组成:
词项字典(Term Dictionary):包含所有文档中出现的唯一词项
倒排列表(Postings List):记录每个词项出现在哪些文档中及位置信息
工作流程:
对文档内容进行分词处理
建立词项到文档的映射关系
查询时先找到词项,再快速定位相关文档
5. 解释Elasticsearch的GET和Search API的区别
答案:
特性 | GET API | Search API |
---|---|---|
用途 | 通过ID获取单个文档 | 执行查询返回多个文档结果 |
性能 | 更快 | 相对较慢 |
结果 | 返回单个完整文档 | 返回匹配文档的列表和元数据 |
路由 | 直接路由到特定分片 | 查询所有相关分片 |
使用场景 | 已知文档ID时获取文档内容 | 需要搜索或过滤文档时 |
示例 | GET /index/_doc/1 | GET /index/_search |
6. 如何优化Elasticsearch的查询性能?
答案: 优化查询性能的常用方法:
索引设计优化:
合理设置分片数量(通常每个分片20-40GB)
使用合适的字段类型和映射
对不需要搜索的字段禁用索引
查询优化:
使用filter代替query进行不相关度评分的过滤
避免使用通配符查询
合理使用分页(避免深分页)
使用bool查询组合多个条件
硬件/配置优化:
增加文件系统缓存
使用SSD硬盘
调整JVM堆大小(不超过物理内存的50%)
7. 如何使用Java API执行Elasticsearch查询?
答案: 使用RestHighLevelClient的示例代码:
// 创建查询
SearchRequest searchRequest = new SearchRequest("index_name");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 构建bool查询
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("title", "elasticsearch")).filter(QueryBuilders.rangeQuery("date").gte("2022-01-01"));
sourceBuilder.query(boolQuery);
sourceBuilder.from(0);
sourceBuilder.size(10);
searchRequest.source(sourceBuilder);
// 执行查询
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
// 处理结果
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {String sourceAsString = hit.getSourceAsString();// 处理文档...
}
8. 解释Elasticsearch集群的健康状态及其含义
答案: Elasticsearch集群有三种健康状态:
绿色(Green):
所有主分片和副本分片都可用
集群功能完全正常
黄色(Yellow):
所有主分片可用,但部分副本分片不可用
数据没有丢失,但高可用性降低
可能原因:节点离线但尚未超过恢复阈值
红色(Red):
部分主分片不可用
数据可能丢失,集群功能不完整
需要立即处理
9.MySQL 和 Elasticsearch 通过消息队列(MQ)同步数据的简单流程
写入阶段
业务应用先写入 MySQL
同时发送一条包含变更数据的消息到 MQ(如 Kafka/RabbitMQ)
传输阶段
MQ 暂存变更消息
按顺序将消息分发给消费者服务
同步阶段
消费者服务从 MQ 获取消息
将数据转换为 ES 文档格式
通过批量接口写入 Elasticsearch
容错处理
失败消息自动重试
最终失败的消息进入死信队列
定期执行数据校验修复差异
关键特点:
完全解耦(MySQL 和 ES 不直接交互)
最终一致性(通常延迟在秒级)
支持高并发场景
对业务代码侵入小(只需增加发消息逻辑)
这种方案适合大多数需要异步同步的业务场景,如商品信息同步、订单状态更新等。相比直接双写,通过 MQ 能更好地处理峰值流量和系统故障。