2026-02-08
后端技术
00

目录

为什么要使用es
ES的核心概念
倒排索引
用一个例子讲倒排索引
分词后
构建倒排索引
结论
分片
副本
一次查询在分布式ES中是怎么跑的

相关信息

es基础知识点学习(Elasticsearch)

为什么要使用es

  • 先抛出一个问题

如果数据库已经能 like '%关键词%' 查询了,为什么还要 ES?

  • 可以总结为三点
    • 海量数据(千万、上亿)
    • 高性能搜索(毫秒级)
    • 复杂搜索需求(全文检索、相关性排序、高亮、分词)

ES的核心概念

elasticsearchmysql
Index(索引)database
Document(文档)row(行)
Field(字段)column(行)
Mapping表结构
Shard(分片)数据拆分
Replic(副本)数据备份

倒排索引

可以理解为词 -> 出现在哪些文档中 的映射维护

用一个例子讲倒排索引

假设有3条文档:

js
文档1:我 爱 北京 文档2:我 爱 上海 文档3:北京 是 中国 的 首都

分词后

js
我、爱、北京 我、爱、上海 北京、是、中国、的、首都

构建倒排索引

js
我 → 文档1,文档2 爱 → 文档1,文档2 北京 → 文档1,文档3 上海 → 文档2 中国 → 文档3

结论

搜索“北京”时,ES 直接定位到文档 1 和 3,而不是扫描所有文档

分片

  • 为什么分片
    • 一个索引假如有1TB数据,那么放在一台机器上肯定是不行的,所以需要将索引拆分为多份
  • 概念
    • 分片是索引的最小存储和查询单元
  • 分片带来的好处
    • 数据分散储存
      • 一个索引的数据分布在多台机器上
      • 单台机器压力下降
    • 查询并行执行
      • 一次查询-> 同时查多个分片
      • 最后汇总结果
  • 举例
    • 一个索引: order_index
    • 设置: 5个主分片
    js
    order_index ├─ shard 0 ├─ shard 1 ├─ shard 2 ├─ shard 3 └─ shard 4
    每个分片都是一个 独立的 Lucene 索引

副本

  • 什么是副本

    副本是主分片的拷贝

  • 副本解决了什么问题
    • 高可用
      • 某台机器挂了,副本立即顶上,服务不受影响
    • 提升查询性能
      • 查询可以落在主分片或者副本,查询压力被分摊

一次查询在分布式ES中是怎么跑的

  1. 请求先到某个节点(协调节点)
  2. 协调节点把请求广播到所有相关分片
  3. 每个分片本地并行查询
  4. 协调节点汇总结果、排序
  5. 返回给客户端

本文作者:曹子昂

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!