倒排索引的结构与传统的索引结构相反,传统的索引结构是由文档构成的,每个文档包含了若干个词汇,然后根据这些词汇建立索引。而倒排索引是由词汇构成的,每个词汇对应了若干个文档,然后根据这些文档建立索引。
ES中倒排索引的基本概念
- 文档(Document):是 Elasticsearch 中最小的数据单元,类似于关系型数据库中的一行记录。文档以 JSON 格式存储,包含一个或多个字段。
- 词条(Term):对文档内容进行分词后得到的单个词汇或短语。
{
"id": 1,
"name": "iPhone 14",
"price": 9999,
"description": "A high - end smartphone"
}
对于一个包含多个词汇的文档,倒排索引会将每个词汇作为一个关键字(Term),然后记录下该词汇所在的文档编号(Document ID)及该词汇在文档中的位置(Term Position)。这样,当用户输入一个关键字时,就可以快速地查找到包含该关键字的文档编号,然后通过文档编号再查找到对应的文档内容。
倒排索引的建立过程
将词条作为索引的键,将包含该词条的文档列表作为值。
-
分词:首先ES 会对文档进行分词处理,将文档中的文本转换为一个个词条。
-
索引:对于每个词条,ES 会在倒排索引中创建一个对应的条目。该条目包含词条本身以及指向包含该词条的文档的指针或引用。
-
词典:存储所有不重复的词条,通常采用树形结构(如 FST,有限状态转移机)来实现,以提高查询效率。
-
postings list:对于每个词条,都有一个对应的 postings list,用于记录包含该词条的文档的相关信息,如文档 ID、词条在文档中的位置、出现频率等。为了节省存储空间和提高查询性能, postings list 通常会进行压缩存储,如采用 Roaring Bitmap 等压缩算法。
查询过程
当用户发起一个查询请求时,ES 会先对查询语句进行分词,得到查询词条。然后在倒排索引的词典中查找每个查询词条,找到对应的 postings list。根据 postings list 中的文档信息,对查询结果进行合并、排序和过滤等操作,将符合条件的文档返回给用户。