开发者学堂课程【Lucene 知识精讲与实战(上): lucene 索引流程详细分析】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/700/detail/12328
lucene 索引流程详细分析
内容介绍:
一、课程回顾
二、索引流程分析
三、Lucene 底层存储结构
一、课程回顾
先来回忆一下这张图
索引流程:对文档索引的过程,将用户要搜索的文档内容进行索引,索引存储在索引库(index)中。
二、索引流程分析
1.获得原始数据内容
原始内容:原始内容是指要索引和搜索的内容,包括互联网上的网页、数据库中的数据、磁盘上的文件等。得看它的数据来源是在什么地方,下面我们会讲解在不同来源获得原始数据的方法。
2.获得文档(采集数据)
从互联网上、数据库、文件系统中等获取需要搜索的原始信息,这个过程就是信息采集,采集数据的目的是为了原始内容进行索引。
采集数据分类:
1)对于互联网上网页、可以使用工具将网页抓取到本地生成HTML文件;
2)数据库中的数据,可以直接连接到数据库读取表中的数据;
3)文件系统中的某个文件,可以通过 I/O 操作提取文件的内容。
在互联网上采集信息的软件通常成为爬虫或蜘蛛,也称为网络机器人,爬虫访问互联网上的每一个网页,将获取到的网页内容存储起来。
3.创建文档
获取原始文档内容的目的是为了索引,在索引前需要将原始内容创建成文档,文档中包括一个一个的域,域中存储内容。在这里可以将磁盘上的一个文件当成一个 document(文档),document 中包含一些 field(域)。很多个文档组成了一个文档集合,很多的域组成了一个文档,每个文档对应一篇文章或者数据表中的一条数据,如下图所示:
如果是数据表中的一条数据代表一个文档,在产生文档对象的时候 Lucene 会为他产生一个唯一的 ID,这个 ID 是这个文档的唯一标识,在文档当中又有很多的域,每个域当中会有属于它的数据,一个一个字段的,每个字段里有每个字段的内容,比如上图的 ID 为111的内容有id为1,name为vivo x23 8GB+128GB幻夜蓝 全网通4G手机,brandName 为 vivo。前面的id是域名,后面的是它的域值。ID 和 id 是不一样的,id指的是数据库当中的一个属性,ID 指的是 document 的 ID,是整个文档的唯一标识,我们控制不了这个,因为是 Lucene 给它自动分配的,但是可以控制得了 id。文档的内容创建完了之后需要把内容提取出来进行一个切分词,切分词之后来组建它的索引(目录)。
4.分析文档
将原始内容创建为包含域(field)的文档(document),需要再对域中的内容进行分析,分析成为一个个的单词。
举例切分词:
原文档的内容:
vivo x23 8GB+128GB 幻夜蓝 全网通4G手机
华为 HUAWEI 麦芒7 6G+64G 亮黑色 全网通4G手机
分析后得到的词:
vivo,x23,8GB,128GB,幻夜,幻夜蓝,全网,全网通,网通,4G,手机,华为,HUAWEI,麦芒7......重复的词和标点符号都会被过滤掉,切分完之后都会变成一个个索引。
5.索引文档
对所有文档分析得出的词汇单元进行索引,索引的目的是为了搜索,最终要实现只搜索被索引的语汇单元从而找到 document(文档)。
创建索引是对语汇单元索引,通过词语找文档,这种索引的结构叫做
倒排索引结构,倒排索引结构是根据内容(词汇)找文档,如下图:
这个索引前面放的是关键字,后面放的是文档号。我们只能根据关键字来分配关键字,因为文档编号我们是控制不了的,我们把关键字组成一个目录(索引)之后,后面的文档号是关键字的来源。要是两个文档都包含关键字,比如“手机”,这两个文档都有这个关键词,我们就把这两个文档的ID放到索引当中,图中的“222”排在“111”前面的原因是因为这个是倒排表,是从后面往前面的查的,关键词和文档编号是有关联关系的。查询“手机”关键字的时候就可以找到“222”和“111”这两篇文档,这个速度是很快的。如果不用这个方法,逐字逐字地查,如果数据量特别大,速度就会非常的慢。
三、Lucene 底层存储结构
这是一个完整的一个图,一条数据组成一个文档,所有数据组在一块的就叫做文档结合,在文档当中有域,里面的结构是 key value 的结构(域名+域值),把文档集合的值进行切分词得到左边手机状的关键字目录(index 索引),关键字和文档编号是有关联关系的,在查的时候通过关键词找到文档编号,通过文档编号找到具体的文档,也就是正文内容,速度非常快,这个索引是要提前建立的,这样速度才会更快。比如百度,它每天24小时不间断的进行索引建立(互联网关联),这样用户在查询的时候才能更快。但京东和淘宝这些商品类的是进行商品上架之后才形成的索引目录,用户再进行查询。