索引的概念
索引在生活中存在方方面面的应用。比如你去超市,超市把商品分了不同的区间,日用平、生鲜、粮油、饮料等等,比如你去买可乐,直接去立着饮料牌子的区间去找就可以,不用去挨着寻找,那这里的“牌子”就是索引。再以字典为例,要找“赵”这个字的详细解释,你不需要捧着厚厚的字典从头到尾找,只要翻到z字母所在区间去找就可以了。
由上所述,索引的目的就是帮助你快速查找目标。如果以信息的角度讲,索引就是一批具有顺序的数据结构,形成文件存储在介质中,帮助快速定位到数据。
倒排索引的概念
百度百科的定义:
倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file)。
说的好像不是那么简洁明了,通过后面的案例实践,也许会对这一概念有更深的理解。
倒排索引计算
首先介绍倒排索引计算所依赖的一些其它概念。
分词(analyze)
在全文检索技术中,对文本数据做字、词、段的加工处理,形成一个或多个词项(term)。
例如文本:“我的名字叫赵利文”
字的处理:我 的 名 字 叫 赵 利 文
词的处理: 我的 名字 赵利文
段落的处理:我的名字叫赵利文
不同的分词器,算法不同,对字、词、段的处理结果也不同。专门用来处理英文的分词器对中文的处理可能不是特别准确到位。
文档对象(document)
对杂乱无序的数据进行整理,形成结构化的数据对象,就叫文档对象。不同的文档对象可以分为不同的属性。比如网页,就可以有标题、网址、网页简介、网页内容等文档属性。再比如商品信息,可以有商品名称、商品价格、商品图片等文档属性。
域属性(field)
文档对象的属性,就称为域属性。通过对域属性进行分词,为索引的建立提供重要保障。域属性可以作为文档的私有属性,比如不需要进行分词的网页地址、图片地址、价格等内容。
倒排索引算法
之所以搜索引擎可以快速在海量的数据中查询出你想要的数据,索引文件起到的作用举足轻重。 Lucene将原始数据经过一些列加工处理,形成了可以被识别和计算的索引文件。
我们以两个网页来举例。
网页1:
标题:全球与新冠病毒长期共存,中国该怎么办
来源:国是直通车
内容:新冠病毒长期存在,将对人类社会带来诸多改变。中国应为此作何准备?
网页2:
标题:外媒:中国和巴西展开新冠病毒疫苗合作
来源:新华社客户端
内容:圣保罗州将与中国实验室合作生产和测试新冠病毒疫苗。
爬虫将两个网页抓取之后,建立document。
文章标题:title
文章来源:origin
文章内容:content
网页1:
id:did1
title:全球与新冠病毒长期共存,中国该怎么办
origin:国是直通车
content:新冠病毒长期存在,将对人类社会带来诸多改变。中国应为此作何准备
网页2:
id:did2
title:中国和巴西展开新冠病毒疫苗合作
origin:新华社客户端
content:圣保罗州将与中国实验室合作生产和测试新冠病毒疫苗。
对文档对象进行分词计算,得到词项。
did1
中国(2)新冠病毒(2)人类(1)
did2
中国(1)巴西(1)新冠病毒(2)疫苗(2)
以表格的形式,对分词做记录:
词项\id | did1 | did2 | did3 | … |
---|---|---|---|---|
中国 | 1 | 0 | 0 | 0 |
疫苗 | 0 | 1 | 0 | 0 |
新冠病毒 | 1 | 1 | 0 | 0 |
巴西 | 0 | 1 | 0 | 0 |
人类 | 1 | 0 | 0 | 0 |
读取上述表格就可以得到每个词项的二进制数据(倒排索引表):
中国:1000
疫苗:0100
新冠病毒:1100
巴西:0100
人类:1000
如果搜索:新冠病毒&人类。首先对两个词项进行与运算,得到:1100&1000=1000,同时满足新冠病毒和人类的文档id为did1。这样就通过查询的词项快速定位到了满足搜索要求的文档对象id。
通过did1,就可以拿到did1相关的其它域属性进行返回展示了。如果域属性中包含了网页地址,用户点击之后,就可以直接跳转到原网页进行详细浏览了。这就是类似与百度搜索引擎这样的网站底层搜索技术的简单模型了。
索引文件的结构分两部分:(1)海量的document对象集合。(2)倒排索引表。
到此为止,倒排索引算法就结束完毕了。欢迎留言交流。