什么是 Elasticsearch?都要学什么?傻子可懂,一个视频讲清楚

一、为什么需要 Elasticsearch?

  • 场景问题:后端程序员使用传统数据库(如 MySQL)实现文章搜索功能时,用户投诉搜索效果差(如搜索“鱼皮教程”无法匹配“鱼皮的ES入门教程”)。
  • 核心痛点:传统数据库的 LIKE 查询无法实现灵活、高效的全文检索。
  • 解决方案:引入 Elasticsearch(ES),一个专为搜索设计的分布式数据库(搜索引擎数据库)。
  • 核心优势
    • 存储和管理海量文本数据
    • 提供快速、准确、灵活的全文检索能力
    • 支持全文搜索、数据分析等场景

二、Elasticsearch 基础概念

1. 核心类比
  • 传统数据库(如 MySQL):像图书馆书架,需手动逐排查找书籍。
  • Elasticsearch:像图书馆电子检索系统,输入关键词即可快速定位并按相关性排序。
2. 关键术语
术语 说明
索引(Index) 类似数据库中的表,存放数据的容器。创建时需定义映射(Mapping),类似表结构。
文档(Document) 类似表中的一行数据,使用 JSON 格式存储,无需预定义字段,动态灵活。
字段(Field) 文档中的数据属性,可指定类型(如 text、keyword)及分词器。
映射(Mapping) 定义索引中字段的数据类型、分词规则等(如使用 IK 分词器)。

三、快速上手:安装与操作

1. 安装与可视化工具
  • ES 安装
    • 官网下载安装包,运行后默认通过 9200 端口提供 RESTful API。
    • 操作方式:curl 命令、Postman 等工具发送 HTTP 请求。
  • 可视化工具 Kibana
    • 官网下载安装,运行后访问 5601 端口
    • 功能:直观查看/分析数据,在 开发工具(Dev Tools) 控制台直接执行查询语句。
2. 基本操作(Kibana Dev Tools)
// 1. 创建索引(定义映射)
PUT /article
{
  "mappings": {
    "properties": {
      "title": { 
        "type": "text",
        "analyzer": "ik_max_word"  // 使用 IK 分词器
      },
      "content": { "type": "text" }
    }
  }
}

// 2. 插入文档
POST /article/_doc/1
{
  "title": "鱼皮的ES入门教程",
  "content": "本文讲解ES基础..."
}

// 3. 搜索文档(全文检索)
GET /article/_search
{
  "query": {
    "match": {
      "title": "鱼皮教程"  // 即使标题无完整词,也能匹配(分词后匹配)
    }
  }
}
3. 核心查询语法(DSL)
  • DSL(Domain Specific Language):ES 的 JSON 格式查询语言。
  • 常用查询类型
    • match:全文检索(分词后匹配)。
    • term:精确匹配(不分词)。
    • bool:组合多条件(mustshouldmust_not)。
    • range:范围查询(如日期、数值范围)。
  • 学习建议:无需死记语法,结合文档或 AI 工具实践即可。

四、核心原理:为什么 ES 搜索快又准?

1. 倒排索引(Inverted Index)
  • 原理
    1. 分词:将文档内容切分为单词(如“鱼皮的ES入门教程” → “鱼皮”、“ES”、“入门”、“教程”)。
    2. 建索引:建立 单词 → 文档ID 的映射关系。
  • 查询流程
    1. 对搜索词分词(如“鱼皮教程” → “鱼皮”、“教程”)。
    2. 通过倒排索引快速定位包含这些词的文档。
  • 对比传统数据库:无需逐行扫描,效率大幅提升。
2. 分词器(Analyzer)
  • 作用:决定文本如何被切分。
  • 内置分词器
    • Standard Analyzer:按空格/标点切分(适合英文,中文效果差)。
  • 中文分词器:IK Analyzer
    • ik_smart:智能分词(粗粒度,如“程序员”不拆分)。
    • ik_max_word:最细粒度分词(如“程序员”→“程序”、“员”)。
    • 推荐用法
      • 索引时用 ik_max_word(最大化召回率)。
      • 搜索时用 ik_smart(提升精确度)。
    • 自定义词典:添加专有名词(如“鱼皮”)避免被错误拆分。

五、高级功能

1. 高亮显示(Highlight)
  • 作用:在搜索结果中标记匹配的关键词。
  • 实现方式
    GET /article/_search
    {
      "query": { "match": { "title": "鱼皮" } },
      "highlight": {
        "fields": { "title": {} }  // 指定高亮字段
      }
    }
    
  • 返回结果:匹配词被 <em> 标签包裹,前端可自定义样式。
2. 相关性排序(BM25 算法)
  • 评分因子
    1. 词频(TF):关键词在文档中出现次数越多,分数越高。
    2. 文档长度:关键词在短文档中占比更大,分数更高。
    3. 逆文档频率(IDF):关键词在所有文档中越罕见,分数越高。
  • 结果:分数(_score字段)越高,排序越靠前。
3. 聚合分析(Aggregation)
  • 作用:类似 SQL 的 GROUP BY,支持数据统计与分析。
  • 常见类型
    • Terms 聚合:按字段值分组统计(如统计各标签的文章数)。
    • Metric 聚合:求和/平均值/最大值等(如计算平均阅读量)。
    • 嵌套聚合:多层分组统计(如按标签分组后,再按发布日期分组)。
  • 示例
    GET /article/_search
    {
      "size": 0,
      "aggs": {
        "tags_count": {
          "terms": { "field": "tags.keyword" }
        }
      }
    }
    

六、生产环境实践

1. 数据同步方案(ES 与 MySQL)
方案 原理 优点 缺点 适用场景
定时任务 定期扫描 MySQL 更新数据同步到 ES 实现简单 有延迟(分钟级) 低实时性需求
双写(Dual Write) 写 MySQL 时同步写 ES 实时同步 降低写入性能;需处理 ES 写入失败 写入量小
Logstash 配置 Logstash 从 MySQL 拉取数据同步到 ES 无需编码 需额外组件;灵活性有限 简单同步需求
Canal 监听 MySQL Binlog,实时同步变更 高实时性 部署复杂 高实时性要求(如电商)
2. 集群架构设计
  • 节点类型
    • Master 节点:管理集群状态(节点、元数据)。
    • Data 节点:存储数据、处理读写请求。
  • 高可用要求
    • 生产环境至少 3 个节点(避免单点故障)。
    • 启用 副本(Replica):每个分片创建副本存储于其他节点,数据不丢失,服务不中断。
  • 分片(Shard)机制
    • 作用:将索引数据拆分为多份,分布到不同节点。
    • 优势:突破单节点存储限制,并行处理提升性能。
    • 配置:创建索引时指定分片数和副本数(如 5 分片 + 1 副本)。

七、进阶学习路径

1. 核心问题驱动学习
  • ES 为什么快?
    • 倒排索引优化(基于 Lucene 引擎)。
    • 内存缓存常用数据(优先内存读取)。
    • 分布式并行处理(多节点协同查询)。
  • 数据写入流程? → 了解 Lucene 的段(Segment)合并机制。
  • 查询执行流程? → 理解协调节点(Coordinating Node)的分发策略。
2. 推荐学习资源
  • 官方文档:版本迭代快,文档最权威(https://www.elastic.co/guide)。
  • 面试题:通过高频题目掌握核心知识点(如倒排索引、分片原理、数据同步方案)。
  • 动手实践
    • 搭建 ES + Kibana 环境。
    • 实现中文搜索(配置 IK 分词器)。
    • 同步 MySQL 数据(尝试定时任务或 Canal)。
    • 性能调优(监控集群状态、优化查询语句)。

八、总结

  • ES 定位:分布式全文搜索引擎,解决传统数据库搜索效率低、灵活性差的问题。
  • 核心能力:倒排索引、分词器、相关性排序、聚合分析。
  • 生产关键:数据同步方案、集群高可用(分片+副本)、性能调优。
  • 学习建议
    “ES 是实战型技术,一定要多动手实践!”
    —— 从基础操作到集群部署,通过项目深化理解。
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐