搜索引擎-倒排索引

361 阅读3分钟

正向索引: 当用户发起查询时(假设查询为一个关键词),搜索引擎会扫描索引库中的所有文档,找出所有包含关键词的文档,

为了增加效率,搜索引擎会把正向索引变为反向索引(倒排索引)即把“文档→单词”的形式变为“单词→文档”的形式

搜索引擎的索引其实就是实现“单词-文档”矩阵的具体数据结构。

搜索引擎的索引其实就是实现“单词-文档”矩阵的具体数据结构。

20210314105948491.png

  • 纵向: 表示每个单独的文档包含了哪些单词,比如D1包含了“乔布斯这个词”,D4包含了“乔布斯”和“iPad2”。
  • 横向: 表示哪些文档包含了该单词,比如D2、D3、D5包含了“苹果”这个词。

倒排索引(Inverted Index) :倒排索引是实现“单词-文档矩阵”的一种具体存储形式,通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。

倒排索引主要由两个部分组成:“单词词典”和“倒排文件”

  • 单词词典(Lexicon):搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。
  • 倒排列表(PostingList):倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。
  • 倒排文件(Inverted File):所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件即被称之为倒排文件,倒排文件是存储倒排索引的物理文件。

image.png

  • Doc1:乔布斯去了中国。
  • Doc2:苹果今年仍能占据大多数触摸屏产能。
  • Doc3:苹果公司首席执行官史蒂夫·乔布斯宣布,iPad2将于3月11日在美国上市。
  • Doc4:乔布斯推动了世界,iPhone、iPad、iPad2,一款一款接连不断。
  • Doc5:乔布斯吃了一个苹果。

image.png

倒排文件的储存 参考MMAP系统

mmap最大的一个好处是操作系统会自己将磁盘上的文件映射到内存,当内存足够的时候,操作文件就像操作内存一样快,而当内存不足的时候,操作系统又会自己将一些页从内存中去掉,实现了一个类似缓存的东西。特别适合于对于巨大文件的读操作,而我们的倒排索引文件就是这种巨大的文件,而且基本上写入一次以后就不太修改了,每次查询都读操作,所以使用mmap是一个比较好的选择。

一个巨大的文件mmap之后,文件读写操作的性能由系统内存决定,系统可用内存越大,那么读写文件的性能越好,因为操作系统的内存足够,系统会将更多的文件载入到内存,提高系统吞吐量。

import Syscall
func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error)
文件描述符,偏移量,需要映射的长度,期望的内存保护标志【是只读还是只写还是读写】,映射方式【是否同步到文件,还是只是副本修改等】

func NewMmap(file_name string, mode int) (*Mmap, error) 新建一个mmap \
func (this *Mmap) ReadInt64(start int64) int64 //从指定位置读取一个int64的值 \
func (this *Mmap) WriteInt64(start, value int64) error //在指定位置写入一个int64的值 \
func (this *Mmap) ReadDocIdsArry(start, len uint64) []DocIdNode //从指定位置读取一个docid的链

原文链接:blog.csdn.net/qq_43403025…