Elasticsearch倒排索引详解

Elasticsearch 是一个分布式搜索和分析引擎,广泛应用于全文搜索、日志分析等领域。其核心技术之一是倒排索引(Inverted Index),它使得 Elasticsearch 能够快速有效地进行全文搜索。

一、 定义

1. 倒排索引

  • 常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。
  • 它是文档检索系统中最常用的数据结构。通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。
    2. 倒排索引 VS正排索引
特性正排索引(Forward Index)倒排索引(Inverted Index)
存储内容文档到词的映射关系词到文档的映射关系
存储结构每个文档记录包含的所有词每个词记录包含它出现的所有文档 ID
查询效率低效,需要扫描所有文档来查找包含某词的文档高效,只需查找词的索引即可获取包含该词的文档
适用场景适用于按文档检索词或统计词频适用于全文搜索,快速查找包含特定词的所有文档
查询操作查询文档 -> 获取词查询词 -> 获取包含该词的文档
存储空间可能较大,因为每个文档可能包含许多词可能较小,因为词典通常比文档集合小得多
复杂度实现简单,但查询性能较差实现复杂,但查询性能优越
更新操作直接修改文档内容需要重新构建索引或部分更新
优缺点优点:简单易实现;缺点:查询效率低优点:查询效率高;缺点:实现复杂,更新成本高

二、倒排索引的结构

倒排索引主要由以下几个部分组成:

  • 词典(Term Dictionary)
    ① 包含所有在文档集合中出现的词汇,是一个按字母顺序排序的列表,其中每个词条(term)都指向一个倒排列表。
    ② 词典的作用是快速查找词汇对应的倒排列表。
  • 倒排列表(Posting List)
    ① 记录包含某个词的所有文档 ID 以及词在文档中的位置。
    ② 每个词在倒排列表中的条目称为一个文档条目(posting),一个文档条目通常包含以下信息:
    • 文档 ID:文档的唯一标识符
    • 词频(Term Frequency, TF):词在文档中出现的次数
    • 位置列表(Position List):词在文档中的位置(可选)
    • 其它信息:例如词在标题或正文中的位置,词在文档中的重要性等

三、倒排索引的构建与查询

1. 构建

  • 文档收集:收集需要索引的文档集合。
  • 分词:将每个文档分解成独立的词汇(词条)。
  • 词汇规范化:对词汇进行规范化处理,例如小写转换、去除停用词、词干提取等。
  • 构建倒排列表:为每个词汇构建倒排列表,记录包含该词的所有文档 ID 及相关信息。
  • 生成索引文件:将词典和倒排列表存储在索引文件中,供查询时使用。
    2. 查询过程
  • 查询解析:将用户的查询解析为独立的词汇。
  • 查找倒排列表:在词典中查找每个词汇对应的倒排列表。
  • 合并结果:根据倒排列表中的文档 ID 合并结果,进行布尔运算、评分排序等处理。
  • 返回结果:将查询结果返回给用户。

3. 示例

  • 文档内容
    文档1: “I love Elasticsearch”
    文档2: “Elasticsearch is powerful”
    文档3: “I love powerful search engines”
  • 构建倒排索引的过程如下
    ① 分词和规范化
    对文档进行分词和规范化处理:
    文档1: “I”, “love”, “elasticsearch”
    文档2: “elasticsearch”, “is”, “powerful”
    文档3: “I”, “love”, “powerful”, “search”, “engines”
    ② 构建词典和倒排列表
    词典:I, love, elasticsearch, is, powerful, search, engines
    倒排列表:
    I -> [ (1), (3) ]
    love -> [ (1), (3) ]
    elasticsearch -> [ (1), (2) ]
    is -> [ (2) ]
    powerful -> [ (2), (3) ]
    search -> [ (3) ]
    engines -> [ (3) ]

四、倒排索引的优化

1. 压缩技术

  • 前缀压缩:对词典进行前缀压缩,以减少存储空间。
  • 位图索引:使用位图压缩倒排列表,以减少空间占用。

2. 跳跃表(Skip Lists)
在倒排列表中引入跳跃表,以加快查询速度。跳跃表允许在倒排列表中进行跳跃式查找,从而减少不必要的比较。
:跳表详解可参考跳表

3. 段合并(Segment Merging)
Elasticsearch 将索引分为多个段(Segment),并在后台定期合并小段为大段,以提高查询效率。段合并可以减少索引碎片,提高查询速度。

4. 布隆过滤器(Bloom Filter)(Redis的数据类型之一)
使用布隆过滤器加速词典查询。布隆过滤器是一种空间高效的概率数据结构,用于测试元素是否在集合中。

五、倒排索引的变种

1. 位置倒排索引(Positional Inverted Index)
在倒排列表中记录词在文档中的位置,用于短语查询和邻近查询。例如,搜索 “Elasticsearch powerful” 这两个词相邻的文档。
2. 带有字段的倒排索引(Fielded Inverted Index)
在倒排列表中记录词在不同字段中的位置,用于字段级搜索。例如,区分词在标题、正文、标签等字段中的位置。
3. 多值倒排索引(Multi-Valued Inverted Index)
支持文档中某一字段包含多个值,例如一个文档的标签字段包含多个标签。

六、倒排索引的应用场景

1. 全文搜索
倒排索引是全文搜索引擎的核心技术,支持快速查找包含特定词的文档。

2. 日志分析
在日志分析系统中,倒排索引可以高效地查询和分析大规模日志数据,支持复杂的查询和聚合操作。

3. 推荐系统
倒排索引可以用于推荐系统,支持快速查找相关内容。例如,根据用户的搜索历史和点击记录,推荐相关内容。

4. 电子商务
在电商平台中,倒排索引可以用于产品搜索,支持多字段搜索(如产品名称、描述、标签等),提高用户搜索体验。

  • 12
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值