lucene中文教程

允我心安 提交于 2020-02-12 11:51:08

lucene是什么?

lucene是基于java的开源全文索引工具包。

 

开源好理解,开放源代码嘛!可是,这个全文索引是什么东西?全文索引是索引的一种,不了解索引的朋友可以看这篇文章(索引是什么)。索引是一种有特殊数据结构的数据。在某种情况,通过它,可以对数据进行快速查询。

 

简而言之,lucene是一个jar包,这个jar包有很多的工具类,可以帮助你创建一种名叫全文索引的索引,可以帮助你使用这些被创建的索引来进行快速检索。

 

lucene的原理是什么?

 

这个问题描述的不准确,应该是lucene能够进行快速检索的原理是什么?这个问题lucene的定义"lucene是基于java的开源全文索引工具包"已经给出了答案。通过lecene提供的工具,你对需要进行搜索的原数据(文档,网页,数据库等)进行索引操作,生成一份全文索引数据。在进行检索的时候,你不是对原数据, 而是对索引数据进行搜索的,所以你的检索效率才有了指数级提高(索引数据有利于检索的数据结构)。

 

 

什么是全文索引?

全文索引,又称倒排索引(反向索引)(inverted index),与之相对应的是正排索引(正向索引)(forward index)。

 

正排索引:无论课本,杂志,还是报纸,它们都拥有一个目录。假如我们想看某篇文章,通过目录,我们可以快速的找到这篇文章所在的页面,而不是笨拙的一页页的去翻看这本书。这里,目录就是一个索引。它有文章标题到文章位置(页码)映射的特殊数据结构,可以帮助我们去定位一个文章所在书本的位置。书籍的目录即是相对书籍中的文章的一份索引信息。像目录这种索引,因为通过文章名称(文章名称相当于文章的唯一标识)去找文章,是一个很自然的操作,所以目录这种索引,被称为正向索引(通过人名找人;通过手机品牌找手机)。

 

倒排索引是什么:与正排索引相对立,如果我想通过文章中的一部分内容去找这篇文章(例如:"http://bbkmgt.com"这个网址被包含在哪个文章之中?),就是一个反向操作了,不那么自然了,而且查找速度会特别慢(一本几百页的书籍,如果不做任何处理的话,想找到这个网址在哪里,你需要一行行去查找匹配,查找效率自然很慢)。好在我们可以针对书籍先做处理,找出所有包含"http://bbkmgt.com"的文章,建立一个从"http://bbkmgt.com"到文章的映射,通过映射,还是可以快速检索"http://bbkmgt.com"在哪篇文章之中,这种不太自然的映射结构,被称为倒排索引(例如:如何通过一颗胎记去找人?建立一个胎记到人的映射。通过一颗零件去找手机?建立手机零件到手机的映射。)。虽然建立这个映射的过程比较耗时,但是如果我的查询次数比较多,这个前置的消耗可以被认为是值得的。

 

理解了全文索引,我们可以总结出,使用的lucene基本流程是①建立索引:为原文档建立索引。 ②检索:在索引中进行检索。下面,我们详细解说这两步,并引出一系列的细节操作与相关名词。

 

lucene使用?

 

我们用以下四篇文档为例,说明lucene的具体流程。

1.我是邢星星,我在做一个论坛,讨论一些基础, IT, Java, 搜索引擎, 大数据方面的知识,如果你有疑惑,可以到http://bbkmgt.com来提出问题, 我们共同讨论。

2.本质的,简单的,用本质解释一切。

http://3.bbkmgt.com是bit, byte, kb, mb, gb, tb的缩写。

4.据人民日报报道, 百分之十的学生在大学代数这本课挂科,知道的人表示很吃惊。所以识别一个学生是否合格,就看他的代数成绩。

 

 

一、lucene创建索引,即创建词元term到文档document id的映射。

以文档1为例:

上面我们说到,我们想检索出http://bbkmgt.com被哪个文档包含。与之对应,理论上我们应该建立建立"http://bbkmgt.com"到文档id的映射。

如果我们想检索"大数据", 与之对应,理论上我们应该建立建立"大数据"到文档id的映射。

如果我们想检索"大数据方面", 与之对应,理论上我们应该建立建立"大数据方面"到文档id的映射。

如果我们想检索"大数据方面的", 与之对应,理论上我们应该建立建立"大数据方面的"到文档id的映射。

如果我们想检索"大数据方面的知", 与之对应,理论上我们应该建立建立"大数据方面的知"到文档id的映射。

那么对于任意一篇文档来说,因为用户的检索词不可知,为了应对用户所有可能的检索,那么我们是否应该把每一种可能都建立一种映射。答案是这是不合理的,对于任意一篇文档来说,这种可能太多了。另外,假如用户搜索"大数据知识", 你会发现即使把文档1相邻的所有可能出现的字都建立映射,里面也没有出现"大数据知识",但文档1里面包含了大数据、知识两个词,以我们普通人的视角而言,应该返回文档1。这个时候,你突然想到如果我把文档的每个字符建立一个映射,查询的时候把查询词分割成一个个的字符,到索引里进行检索,当同一个文档同时出现"大","数","据","知","识"时,我就知道我找到了想要的文档。但这个时候,你会发现文档1和文档4,都会被检索出来。文档四和我们的检索词有很大出入。是因为中文的词语才能表示一个清晰完整的意思。所以我们应该切分的足够细但又不能切分出来的词无意义。词元是中文中最小有意义的字的组合。因此,我们应当按照词元term来切分。

二、 lucene使用索引进行检索

理解了索引过程,检索过程也就很清晰了。检索词,选用合适的Analyzer,使用分析出来的tokens到索引里去查询,由于没一个token都可能检索出一个或多个文档,那多个token检索出来的结果,要根据实际需求没选择做交集还是并集,还是其它策略。一般的,如果你的文档集文档数量少,选择交集,能检索出结果;反之,文档数据多,则做并集,结果更为准确。

三、lucene使用索引进行搜索

检索与搜索的区别,检索只是找到文档,而搜索则要,给找到文档排序,哪个文档出现第一位位置,这个是要根据业务而定。这里,要学会如何把一个文档给弄前排。如何把一个文档排序位置降低下去。

lucene优化?

优化指的是减少查询时长。如何能减少查询时长?我们先看一下哪些方面影响查询的时间。针对各个方面做处理。

1.索引文件的大小

2.段的数量

lucene优化即是合并索引操作。

3.查询方式(缓存使用)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!