搜索引擎为什么这么快?Lucene 倒排索引介绍

Posted 大数据技术架构

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搜索引擎为什么这么快?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的数组,及分词在文档中的一些信息。


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

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

  • ID:文档id,用于获取原始信息;

  • 单词频率(TF,Term Frequency):词条在文档中出现的次数,用于后续相关性评分的计算;

  • 位置(Position):词条在文档中以分词为单位的位置,用于做词语搜索(Phrase Query);

  • 偏移量(Offset):词条在文档中以字符为单位的起始和结束偏移量(BeginOffset和EndOffset),用于高亮显示。


这就是最基本的倒排索引了。这种索引结构非常适用于快速的全文搜索。


因此Elasticsearch、Solr等搜索引擎均基于这种结构实现自己的倒排索引,并做了一些索引优化,提高了搜索速度。




喜欢就点一下在看呗

以上是关于搜索引擎为什么这么快?Lucene 倒排索引介绍的主要内容,如果未能解决你的问题,请参考以下文章

ElasticSearch实战-倒排索引算法

ElasticSearch实战-倒排索引算法

Lucene高性能索引之道

es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?底层的 lucene 介绍一下呗?倒排索引了解吗?...

倒排索引,正排索引与lucene

倒排索引在lucene中的应用