什么是lucene
lucene是一个基于java的全文检索库
基于java,是因为它本身就是用java写的,并不是独立运行的产品
全文检索:全文检索(Full-text Search)是指先建立索引,再对索引进行搜索的过程称为全
文检索。
数据的分类
结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。
非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等磁盘上的文件
对非结构化数据的检索,lucene也是采用先建立索引,在根据索引进行检索的,我们也称之为全文检索
非结构化(全文检索)查询方法
顺序扫描法(Serial Scanning)
所谓顺序扫描,比如要找内容包含某一个字符串的文件,就是一个文档一个文档的看,对于
每一个文档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看
下一个文件,直到扫描完所有的文件。如利用windows的搜索也可以搜索文件内容,只是相
当的慢
倒排索引算法(全文检索算法)
描述:把数据库中的所有内容查询出来,然后进行切分词, 分词组成索引(目录),把查询出来的内容存入文档中,索引和文档组成索引库。 在检索时,先找到索引,索引与文档之间有联系, 能快速确定文档,返回数据.这就是倒排索引算法。
全文检索(Full-text Search)(倒叙扫描法)
将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一
定结构的数据进行搜索,从而达到搜索相对较快的目的。这部分从非结构化数据中提取出的
然后重新组织的信息,我们称之索引。
例如:字典。字典的拼音表和部首检字表就相当于字典的索引,对每一个字的解释是非结构
化的,如果字典没有音节表和部首检字表,在茫茫辞海中找一个字只能顺序扫描。
然而字的某些信息可以提取出来进行结构化处理,比如读音,就比较结构化,分声母和韵
母,分别只有几种可以一一列举,于是将读音拿出来按一定的顺序排列,每一项读音都指向
此字的详细解释的页数。我们搜索时按结构化的拼音搜到读音,然后按其指向的页数,便可
找到我们的非结构化数据——也即对字的解释。
*这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)。*
虽然创建索引的过程也是非常耗时的,但是索引一旦创建就可以多次使用,全文检索主
要处理的是查询,所以耗时间创建索引是值得的。
lucene执行原理
索引的创建的过程
获取原始内容–>创建文档–>分析文档–>索引文档
1.获取原始内容
直白点说,原始内容就是数据库中的内容,数据库中,每一“条”记录就是一个文档
2.创建文档
创建文档的目的是为了创建索引,创建索引之前,我们需要先获得文档,文档中含有很多的
域“field”,每个域对应数据库中一个表中的一行数据的某一个列。一个域中含有key(字段名),value(值),也就是键值对
3.分析文档
将原始内容创建为包含域(Field)的文档(document),需要再对域中的内容进行分
析,分析的过程是经过对原始文档提取单词、将字母转为小写、去除标点符号、去除停用词
等过程生成最终的语汇单元,可以将语汇单元理解为一个一个的单词。
Lucene is a Java full-text search engine. Lucene is not a complete
application, but rather a code library and API that can easily be
used
to add search capabilities to applications.
分析后得到的语汇单元:
lucene、java、full、search、engine。。。。
每个单词叫做一个Term,不同的域中拆分出来的相同的单词是不同的term。term中包
含两部分一部分是文档的域名(或者说是key),另一部分是单词的内容(是一个单词,不是value)。
4.创建索引
将所有的词汇单元(term)创建成索引,最后通过这些索引,查找对应的文档,继而得到数据,
注意:创建索引是对语汇单元索引,通过词语找文档,这种索引的结构叫倒排索引结构。
2.3 查询索引
查询索引也是搜索的过程。搜索就是用户输入关键字,从索引(index)中进行搜索的过程。根据关键字搜索索引,根据索引找到对应的文档,从而找到要搜索的内容(这里指磁盘上的文件)。
1) 用户查询接口
全文检索系统提供用户搜索的界面供用户提交搜索的关键字,搜索完成展示搜索结果。
Lucene不提供制作用户搜索界面的功能,需要根据自己的需求开发搜索界面。
2) 创建查询
用户输入查询关键字执行搜索之前需要先构建一个查询对象,查询对象中可以指定查询要搜索的Field文档域、查询关键字等,查询对象会生成具体的查询语法,
例如: 语法 “fileName:lucene”表示要搜索Field域的内容为“lucene”的文档
3) 执行查询
搜索索引过程:
根据查询语法在倒排索引词典表中分别找出对应搜索词的索引,从而找到索引所链接的文档链表。
比如搜索语法为“fileName:lucene”表示搜索出fileName域中包含Lucene的文档。
搜索过程就是在索引上查找域为fileName,并且关键字为Lucene的term,并根据term找到文档id列表。
4) 渲染结果
以一个友好的界面将查询结果展示给用户,用户根据搜索结果找自己想要的信息,为了帮助用户很快找到自己的结果,提供了很多展示的效果,比如搜索结果中将关键字高亮显示,百度提供的快照等。