Apache Lucene 倒排索引介绍

概述

目前主流的一些全文搜索引擎,比如Elasticsearch、Solr等,都是基于开源全文搜索库Apache Lucene构建的。Lucene是一个Java编写的全文搜索引擎库,是一套专注于文本索引和搜索的工具包,能够为应用程序添加索引与搜索能力。

分布式搜索引擎比如Elasticsearch之所以搜索性能这么优秀,得益于其基于Lucene构建的数据结构 — — 倒排索引。

倒排索引

倒排索引(Inverted Index),也被称为反向/逆向索引,是一种索引数据结构。倒排索引建立的是词条到文档的映射关系。Lucene官方给出的定义是:

The index stores statistics about terms in order to make term-based search more efficient. Lucene's index falls 
into the family of indexes known as an inverted index. This is because it can list, for a term, the documents 
that contain it. This is the inverse of the natural relationship, in which documents list terms.

译文(打扰了):

这种索引存储着关于词条的统计信息,以使基于词条的搜索更加高效。Lucene的索引被称为倒排索引。这是因为对于词条来说,它可以列出包含它的所有文档,这与文档列出词条的正常逻辑相反。

例如,现在我们有两条记录,都包含一个content字段,如下:

id 1 → Elasticsearch是最流行的搜索引擎
id 2 → 搜索引擎是如何诞生的

其中每一条记录在文档型搜索系统比如Elasticsearch、Solr中被称为一个文档(Document),每个Document都有一个文档 id。

现在分析文档内容得到关键词如下:

Elasticsearch是最流行的搜索引擎 → [Elasticsearch][流行][搜索引擎]
搜索引擎是如何诞生的 → [搜索引擎][如何][诞生]

分析文档内容得到关键词的过程称为 分词,也称文本分析(Analysis),分析出的各个关键词称为 词条(Term或Token,英文有点生硬)。

倒排索引包含两部分:

  • 分词词典(Term Dictionary):所有分词的集合。
  • 倒排列表(Posting List):文档id的数组,及分词在文档中的一些信息。

上面例子的倒排索引就是如下表示:

TermID[TF]Position[BeginOffset, EndOffset)
Elasticsearch1[1]0[0, 13)
流行1[1]1[15, 17)
搜索引擎1[1], 2[1]2, 0[18, 22), [0, 4)
如何2[1]1[5, 7)
诞生2[1]2[7, 9)

其中,第一列表示的就是Term Dictionary;其余部分属于Posting List,包含以下部分:

  • ID:文档id,用于获取原始信息;
  • 单词频率(TF,Term Frequency):词条在文档中出现的次数,用于后续相关性评分的计算;
  • 位置(Position):词条在文档中以分词为单位的位置,用于做词语搜索(Phrase Query);
  • 偏移量(Offset):词条在文档中以字符为单位的偏移量(BeginOffset和EndOffset),用于高亮显示。

这就是最基本的倒排索引了。这种索引结构非常适用于快速的全文搜索。Elasticsearch、Solr等搜索引擎均基于这种结构实现自己的倒排索引,并做了一些索引优化,提高了搜索速度。

往期推荐

1、HBase最佳实践 | 聊聊HBase核心配置参数
2、Apache Hudi:剑指数据湖的增量处理框架
3、Hadoop社区比 Ozone 更重要的事情
4、MapReduce Shuffle 和 Spark Shuffle 结业篇

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值