Elasticsearch倒排索引

目录

一、传统数据库的正排索引(以MySQL为例)

1. 正排索引的本质

2. MySQL的B+树索引实现

3. 正排索引的查询流程(以name查询为例)

4. 正排索引的局限性

二、Elasticsearch的倒排索引革命

1. 倒排索引的核心思想

2. 倒排索引的构建过程(以文章标题为例)

3. 倒排索引的查询流程

三、核心差异对比

四、Elasticsearch倒排索引的进阶设计

1. 分片与分布式存储

2. 动态更新机制

3. 相关性评分(TF-IDF/BM25)

五、对比

六、根据其技术特点进行技术选型


一、传统数据库的正排索引(以MySQL为例)

1. 正排索引的本质

正排索引是关系型数据库的核心索引机制,其组织方式为:

​
文档ID -> 文档内容
2. MySQL的B+树索引实现
​
-- 用户表示例
CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    age INT,
    email VARCHAR(100),
    INDEX idx_name (name),
    INDEX idx_age (age)
);
3. 正排索引的查询流程(以name查询为例)
  1. 发起查询​(搜索框输入"张三")

    SELECT * FROM users WHERE name = '张三'
  2. MySQL翻目录
    数据库先到name的索引表(类似书的目录)里快速找到:

    "张三" → 对应ID是5(就像目录写着"张三在第5页")
  3. 拿完整数据
    再用这个ID 5去主表里把张三的完整信息(年龄、地址等)全部取出来

  4. 返回结果
    最后把张三的所有信息打包发回给你

4. 正排索引的局限性
  • 模糊查询效率低​:LIKE '%张%'会导致全表扫描
  • 组合查询成本高​:WHERE name='张' AND age=20需要合并多个索引结果
  • 文本搜索能力弱​:无法实现相关性评分、分词搜索等高级功能

二、Elasticsearch的倒排索引革命

1. 倒排索引的核心思想

倒排索引(Inverted Index)颠覆了传统索引方式:

​
分词项 -> [文档ID1, 文档ID2, ...]
2. 倒排索引的构建过程(以文章标题为例)

以下是一个json格式的数据

​
[
  {"id": 1, "title": "Elasticsearch入门教程"},
  {"id": 2, "title": "MySQL与Elasticsearch对比"}
]

在Elasticsearch的分词结果(对于中文的话,它会根据中文的习惯,将其分成有意义的词块):

文档1:["elasticsearch", "入门", "教程"]
文档2:["mysql", "elasticsearch", "对比"]

倒排索引构建:

​
{
  "elasticsearch": [1, 2],
  "入门": [1],
  "教程": [1],
  "mysql": [2],
  "对比": [2]
}
3. 倒排索引的查询流程
  1. 发起请求

    用户搜索关键词"elasticsearch 教程"

  2. 分词处理

    Elasticsearch将查询词拆分为:["elasticsearch", "教程"]

  3. 索引查询

    查找倒排索引发现:

    1. "elasticsearch" → 文档[1,2]
    2. "教程" → 文档[1]
  4. 结果合并

    取两者交集得到最终匹配文档:[1]

  5. 返回结果

    将文档1的完整内容返回给用户

三、核心差异对比

特性 MySQL正排索引 Elasticsearch倒排索引
索引方向 文档→字段值 分词项→文档
存储结构 B+树 FST(有限状态转换机)+ 跳表
查询类型 精确匹配为主 模糊搜索、分词查询、语义匹配
搜索速度 单字段快,多字段慢 多字段联合查询极快
更新代价 单行更新高效 整个分片需要重建索引
典型场景 事务性操作、精确查询 全文搜索、日志分析、复杂聚合

四、Elasticsearch倒排索引的进阶设计

1. 分片与分布式存储
graph TD
    A[索引] --> B[分片1]
    A --> C[分片2]
    B --> D[倒排索引: term->docIDs]
    C --> E[倒排索引: term->docIDs]
2. 动态更新机制
  • 新增文档​:写入内存缓冲区
  • 删除文档​:记录.del文件标记删除
  • 段合并​:定期合并小段(Segment Merge)优化查询
3. 相关性评分(TF-IDF/BM25)
# BM25算法简化公式
score = IDF * (tf * (k1 + 1)) / (tf + k1 * (1 - b + b * (fieldLength / avgFieldLength)))

五、对比

1、MySQL实现全文搜索

-- 需要全表扫描
SELECT * FROM articles 
WHERE content LIKE '%分布式系统%' 
ORDER BY publish_time DESC LIMIT 10;
-- 执行时间:1200ms(百万级数据)

2、Elasticsearch实现相同功能

GET /articles/_search
{
  "query": {
    "match": {
      "content": "分布式系统"
    }
  },
  "sort": [{"publish_time": "desc"}],
  "size": 10
}
// 响应时间:15ms(相同数据量)

六、根据其技术特点进行技术选型

  1. 选择MySQL的场景​:

    • 需要事务支持(如订单系统)
    • 数据强一致性要求
    • 频繁的单条记录更新
  2. 选择Elasticsearch的场景​:

    • 海量文本搜索(如商品搜索)
    • 非结构化数据分析(如日志分析)
    • 需要相关性排序的场景(如内容推荐)

理解倒排索引的实现思想,是掌握现代搜索技术的关键。Elasticsearch通过将"词项→文档"的逆向映射与分布式架构结合,实现了比传统数据库高几个数量级的搜索性能,这正是它成为搜索引擎首选技术栈的核心原因。

你可能感兴趣的:(elasticSearch,elasticsearch,搜索引擎)