5)ElasticSearch
🌱 第 1 题(基础认知)
Q1:Elasticsearch 是什么?它的主要应用场景有哪些?
📝 标准答案:
Elasticsearch 是一个基于 Apache Lucene 构建的开源、分布式搜索和分析引擎,用于处理结构化和非结构化数据,具备强大的全文搜索、实时数据分析能力。
主要特点:
- 高速全文检索;
- 实时数据写入与查询;
- 分布式架构,支持水平扩展;
- RESTful API 接口;
- 强大的聚合分析(类似 SQL 的 Group By + 聚合函数);
- 与 Kibana、Logstash 等组成 Elastic Stack。
应用场景:
- 日志/监控系统(如 ELK Stack:Elasticsearch + Logstash + Kibana);
- 网站搜索引擎(电商搜索、文档搜索);
- 实时数据分析(如用户行为分析、热点词趋势);
- 异常检测(如安全预警);
- 多字段模糊匹配查询。
🌿 第 2 题(核心概念)
Q2:请解释 Elasticsearch 中的 Index、Type、Document、Field 的关系?
📝 标准答案:
概念 | 解释 |
---|---|
Index | 相当于传统数据库中的数据库名,是逻辑上的集合(如:user_index 、product_index )。 |
Type(已废弃) | 旧版本中的概念,相当于数据库中的表;从 7.x 开始不推荐使用,一个 Index 仅支持一个 Type。 |
Document | 相当于数据库中的行数据,是 Elasticsearch 存储的基本单位,一个 JSON 格式的对象。 |
Field | 文档中的键值对,相当于数据库中的列,比如 title 、price 、description 等。 |
例子:
json
{
"id": 1,
"title": "iPhone 14",
"price": 6999
}
- 这个 JSON 是一个 Document;
title
、price
是 Field;- 它属于一个名为
products
的 Index。
🌳 第 3 题(查询与 DSL)
Q3:Elasticsearch 如何实现模糊搜索?请举例说明 Term 查询和 Match 查询的区别。
📝 标准答案:
Elasticsearch 提供两类主要查询方式:
- Term 查询:用于精确匹配(不会进行分词);
- Match 查询:用于全文匹配(会进行分词)。
✅ Term 查询: 用于 keyword 类型字段(不分词的字段)
json
{
"query": {
"term": {
"status": "active"
}
}
}
- 查询字段的值必须与
"active"
完全一致。
✅ Match 查询: 用于 text 类型字段(会自动分词)
json
{
"query": {
"match": {
"title": "iPhone 14 Pro"
}
}
}
- 分词后查询
"iPhone"
、"14"
、"Pro"
; - 更适合模糊匹配、搜索建议等。
总结:
区别 | Term 查询 | Match 查询 |
---|---|---|
分词 | 否 | 是 |
精确匹配 | 是 | 否 |
使用字段 | keyword | text |
用途 | 过滤/筛选 | 模糊搜索 |
🌲 第 4 题(性能优化)
Q4:如何优化 Elasticsearch 的搜索性能?请从索引设计和查询优化两个角度回答。
📝 标准答案:
✅ 索引设计优化:
- 控制字段数量与索引类型(避免无用字段进行索引);
- 设置字段类型合理(如 text / keyword 分清楚);
- 使用合适的分词器(如 ik 分词、n-gram);
- 减少 index/shard 数量过多导致的资源浪费;
- 设置
refresh_interval
适当延迟,减少频繁刷新(默认 1s); - 使用
doc_values
关闭不需要排序/聚合的字段的倒排索引。
✅ 查询优化:
- 使用
filter
而非must
查询进行缓存加速; - 尽量避免使用通配符(如
"*phone"
),使用 EdgeNGram 分词替代; - 使用
search_after
替代from + size
分页大数据集; - 控制返回字段
_source
字段内容(只要需要的字段); - 开启并合理使用缓存(query cache、field data cache);
- 合理分片(不要过多或过少);
- 对查询频繁字段设置
keyword
,避免分词带来误差。
🪵 第 5 题(业务实践)
Q5:你如何设计一个支持商品搜索、筛选、排序的电商搜索系统?用 Elasticsearch 设计整体方案。
📝 标准答案:
✅ 基本设计目标:
- 支持商品名模糊匹配;
- 支持价格区间、品牌、分类等筛选;
- 支持销量、价格等排序;
- 高可用、高性能响应;
✅ 索引结构设计(mapping)
json
{
"mappings": {
"properties": {
"title": { "type": "text", "analyzer": "ik_max_word" },
"brand": { "type": "keyword" },
"category": { "type": "keyword" },
"price": { "type": "float" },
"sales": { "type": "integer" },
"updated_at": { "type": "date" }
}
}
}
✅ 查询方案:
- 关键词搜索(模糊匹配):
json
{ "match": { "title": "iphone 14" } }
- 精确筛选(品牌、分类):
json
{
"bool": {
"filter": [
{ "term": { "brand": "Apple" } },
{ "term": { "category": "phone" } },
{ "range": { "price": { "gte": 4000, "lte": 8000 } } }
]
}
}
- 排序(销量、价格):
json
{ "sort": [{ "sales": "desc" }, { "price": "asc" }] }
✅ 额外优化:
- 分页使用
search_after
; - 推荐系统使用
more_like_this
查询; - 同步数据库与 ES 的商品数据使用 MQ(如 Kafka)进行异步同步;
- 可用 ElasticSearch 的 alias 做版本切换零中断;