Skip to content

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_indexproduct_index)。
Type(已废弃)旧版本中的概念,相当于数据库中的表;从 7.x 开始不推荐使用,一个 Index 仅支持一个 Type。
Document相当于数据库中的行数据,是 Elasticsearch 存储的基本单位,一个 JSON 格式的对象。
Field文档中的键值对,相当于数据库中的列,比如 titlepricedescription 等。

例子:

json
{
  "id": 1,
  "title": "iPhone 14",
  "price": 6999
}
  • 这个 JSON 是一个 Document
  • titlepriceField
  • 它属于一个名为 productsIndex

🌳 第 3 题(查询与 DSL)

Q3:Elasticsearch 如何实现模糊搜索?请举例说明 Term 查询和 Match 查询的区别。

📝 标准答案:

Elasticsearch 提供两类主要查询方式:

  1. Term 查询:用于精确匹配(不会进行分词);
  2. Match 查询:用于全文匹配(会进行分词)。

Term 查询: 用于 keyword 类型字段(不分词的字段)

json
{
  "query": {
    "term": {
      "status": "active"
    }
  }
}
  • 查询字段的值必须与 "active" 完全一致。

Match 查询: 用于 text 类型字段(会自动分词)

json
{
  "query": {
    "match": {
      "title": "iPhone 14 Pro"
    }
  }
}
  • 分词后查询 "iPhone""14""Pro"
  • 更适合模糊匹配、搜索建议等。

总结:

区别Term 查询Match 查询
分词
精确匹配
使用字段keywordtext
用途过滤/筛选模糊搜索

🌲 第 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 做版本切换零中断;