最简单的方法就是,直接这么存。先存储一个有序的文档id数组,然后在存储一个词汇数组。之后创建一个二维数组,数组的横坐标长度和文档id数组长度相同,纵坐标长度和词汇数组相同,然后在这个二维数组的元素中存储1或0。1代表对应位置的文档包含对应位置的词汇,0代表不包含。如图所示:
这种实现方法十分简单,但是却具有一个巨大的缺陷。如果我们的词汇量有50万个,文档量有100万个(在当今这个数量并不大),那么我们需要的存储空间大小就至少要50万*100万=5000亿个字节,也就是至少465gb的信息量,这个信息量要远远大于一台计算机的内存量。这根本是无法忍受的。 倒排索引
那么我们要如何优化这个结构呢?我们不难发现这个矩阵其实具有高度的稀疏性(大量的值为0)。毕竟不可能每本书都有50万个不同的词,如果考虑到大量的论文或者博客的话,可能平均一篇文献中能有1000个不一样的词都很不容易了。这就意味着这个矩阵中99%的元素都为0。这样我们很容易想到,那我们就只记录那些1不就可以了。也就是说我们只要根据词汇去记录那些包含这个词汇的文档就可以了。这样同样我们要维护一个词汇数组,然后词汇数组中的每个元素(也就是每个词汇)都会对应一个文档列表,这个文档列表中保存的是,具有这个词汇的文档的id。这样就极大的节省了存储空间。结构如下:
以上就是倒排索引的一些基本概念。其实倒排索引是一个很早就被人发明出的索引模型,在1958年IBM就在一次会议上展示了一台“自动索引机器”。虽然这种索引方式诞生的很早,但是至今依旧是全文索引的重要的基础之一。