跳转至

ES 搜索引擎相关面试考察点

一、倒排索引

传统:文档 → 词。 倒排:词 → 文档列表。

词"中国" -> [doc1, doc5, doc9, ...]
词"北京" -> [doc1, doc3, ...]

查询"中国 北京",查两个词的倒排表,求交集。

二、ES 核心概念

ES MySQL
Index Database
Type Table(7.x 后废弃)
Document Row
Field Column
Mapping Schema

三、分词

  • Standard:标准分词,按词。
  • IK:中文分词,ik_max_word(最细粒度)、ik_smart(智能)。
  • 索引时用 max,查询时用 smart。

四、DSL 查询

1. 全文查询

{
  "query": {
    "match": { "title": "中国 北京" }
  }
}

2. 精确查询

{
  "query": {
    "term": { "status": "PAID" }
  }
}

3. bool 组合

{
  "query": {
    "bool": {
      "must":     [ { "match": { "title": "ES" } } ],
      "filter":   [ { "term": { "status": "1" } } ],
      "must_not": [ { "term": { "deleted": true } } ],
      "should":   [ { "term": { "hot": true } } ]
    }
  }
}
  • must:必须满足,打分。
  • filter:必须满足,不打分,可缓存。
  • must_not:不满足。
  • should:可选,至少满足一个(有 must 时可不满足)。

五、相关性打分

BM25 算法:TF(词频)× IDF(逆文档频率)× 字段长度归一化。

六、聚合

{
  "aggs": {
    "by_status": {
      "terms": { "field": "status" },
      "aggs": { "avg_amount": { "avg": { "field": "amount" } } }
    }
  }
}

七、ES vs MySQL

  • MySQL 用 B+ 树,适合精确查询和事务。
  • ES 用倒排索引,适合全文检索、复杂条件、聚合分析。
  • 业务数据在 MySQL,ES 是从 MySQL 同步过来的副本。

八、ES 为什么慢 / 快

  • 快:倒排索引、内存计算、分片并行。
  • 慢:深分页、聚合大结果集、wildcard、内存不足。

高频追问

  • ES 近实时:写入后默认 1s 才能搜到(refresh_interval)。
  • 为什么不建议深分页?coordinate 节点要合并各分片数据。