1、Lucene简介java
Lucene是有知名全文检索/索引专家Doug Cutting采用Java语言开发的基于全文搜索的软件工具,以后贡献给Apache软件基金会作为一个开源项目,成为一个开放源代码的全文检索引擎工具包,因为他的高性能,可伸缩性并且经历了很长时间的沉淀,已是很成熟的项目,被普遍集成于系统软件中,甚至一些商用软件也采用了Lucene作为其内部全文检索子系统的核心,如IBM的开源软件Eclipse 的帮助文档,也是采用了Lucene作为其全文搜索引擎。Lucene 可以为文本类型的数据创建索引,因此你只要能把你要索引的数据格式转化的文本的,Lucene 就能对你的文档进行索引和搜索。好比你要对一些 HTML 文档,PDF 文档进行索引的话你就首先须要把 HTML 文档和 PDF 文档转化成文本格式的,而后将转化后的内容交给 Lucene 进行索引,而后把建立好的索引文件保存到磁盘或者内存中,最后根据用户输入的查询条件在索引文件上进行查询。不指定要索引的文档的格式也使 Lucene 可以几乎适用于全部的搜索应用程序。算法
下载地址:http://www.apache.org/dyn/closer.cgi/lucene/java/4.9.0数据库
2、Lucene的优势apache
1、索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不一样平台的应用可以共享创建的索引文件。服务器
2、在传统全文检索引擎的倒排索引的基础上,实现了分块索引,可以针对新的文件创建小文件索引,提高索引速度。而后经过与原有索引的合并,达到优化的目的。数据结构
3、优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度下降,方便扩充新功能。架构
4、设计了独立于语言和文件格式的文本分析接口,索引器经过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只须要实现文本分析的接口。工具
5、已经默认实现了一套强大的查询引擎,用户无需本身编写代码即便系统可得到强大的查询能力,Lucene的查询实现中默认实现了布尔操做、模糊查询、分组查询等等。性能
3、什么是全文检索学习
全文检索是指计算机索引程序经过扫描文章中的每个词,对每个词创建一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先创建的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程相似于经过字典中的检索字表查字的过程。
全文检索的方法主要分为按字检索和按词检索两种。按字检索是指对于文章中的每个字都创建索引,检索时将词分解为字的组合。对于各类不一样的语言而言,字有不一样的含义,好比英文中字与词其实是合一的,而中文中字与词有很大分别。按词检索指对文章中的词,即语义单位创建索引,检索时按词检索,而且能够处理同义项等。英文等西方文字因为按照空白切分词,所以实现上与按字处理相似,添加同义处理也很容易。中文等东方文字则须要切分字词,以达到按词索引的目的,关于这方面的问题,是当前全文检索技术尤为是中文全文检索技术中的难点,在此不作详述。
4、Lucene系统结构
系统结构与源码组织图:
从图中咱们清楚的看到,Lucene的系统由基础结构封装、索引核心、对外接口三大部分组成。其中直接操做索引文件的索引核心又是系统的重点。Lucene的将全部源码分为了7个模块(在java语言中以包即package来表示):Analysis,Document,Index,QueryParser,Search,Store,Util.各个模块所属的系统部分也如上图所示。须要说明的是org.apache.lucene.queryPaser是作为org.apache.lucene.search的语法解析器存在,不被系统以外实际调用,所以这里没有看成对外接口看待,而是将之独立出来。
从面象对象的观点来考察,Lucene应用了最基本的一条程序设计准则:引入额外的抽象层以下降耦合性。首先,引入对索引文件的操做org.apache.lucene.store的封装,而后将索引部分的实现创建在(org.apache.lucene.index)其之上,完成对索引核心的抽象。在索引核心的基础上开始设计对外的接口org.apache.lucene.search与org.apache.lucene.analysis。在每个局部细节上,好比某些经常使用的数据结构与算法上,Lucene也充分的应用了这一条准则。在高度的面向对象理论的支撑下,使得Lucene的实现容易理解,易于扩展。
Lucene在系统结构上的另外一个特色表现为其引入了传统的客户端服务器结构之外的的应用结构。Lucene能够做为一个运行库被包含进入应用自己中去,而不是作为一个单独的索引服务器存在。这天然和Lucene开放源代码的特征分不开,可是也体现了Lucene在编写上的原本意图:提供一个全文索引引擎的架构,而不是实现。
包名 |
功能 |
org.apache.lucene.analysis |
语言分析器,主要用于的切词,支持中文主要是扩展此类 |
org.apache.lucene.document |
索引存储时的文档结构管理,相似于关系型数据库的表结构 |
org.apache.lucene.index |
索引管理,包括索引创建、删除等 |
org.apache.lucene.queryParser |
查询分析器,实现查询关键词间的运算,如与、或、非等 |
org.apache.lucene.search |
检索管理,根据查询条件,检索获得结果 |
org.apache.lucene.store |
数据存储管理,主要包括一些底层的I/O操做 |
org.apache.lucene.util |
一些公用类 |
Lucene主要逻辑图:
Lucene功能强大,但从根本上说,主要包括两块:一是文本内容经切词后索引入库;二是根据查询条件返回结果。
搜索应用程序和 Lucene 之间的关系
如图:用户要找Document得信息。最早将为Document文档创建Index索引。而后经过search搜索Index从而找到咱们想要的内容。
首先是建立索引
索引通俗地说就是将内容作成书签目录,这样使得咱们能更快地搜索获得内容。对文档创建好索引后,就能够在这些索引上面进行搜索了。搜索引擎首先会对搜索的关键词进行解析,而后再在创建好的索引上面进行查找,最终返回和用户输入的关键词相关联的文档。因此建立索引很重要。
5、检索流程
1. 索引过程:(红线)
1) 有一系列被索引文件
2) 被索引文件通过语法分析和语言处理造成一系列词(Term)。
3) 通过索引建立造成词典和反向索引表。
4) 经过索引存储将索引写入硬盘。
2. 搜索过程:(蓝线)
a) 用户输入查询语句。(Query)
b) 对查询语句通过语法分析和语言分析获得一系列词(Term)。(QueryParser和Analyzer)
c) 经过语法分析获得一个查询树。
d) 经过索引存储将索引读入到内存。(IndexWriter)
e) 利用查询树搜索索引,从而获得每一个词(Term)的文档链表,对文档链表进行交,差,并得
到结果文档。
f) 将搜索到的结果文档对查询的相关性进行排序。
g) 返回查询结果给用户。
6、Lucene全文索引引擎与数据库索
数据库 |
Lucene全文索引引擎 |
|
索引 |
对于LIKE查询来讲,数据传统的索引是根本用不上的。数据须要逐个便利记录进行GREP式的模糊匹配,比有索引的搜索速度要有多个数量级的降低。 |
将数据源中的数据都经过全文索引一一创建反向索引 |
匹配效果 |
使用:like "%net%" 会把netherlands也匹配出来, 多个关键词的模糊匹配:使用like "%com%net%":就不能匹配词序颠倒的xxx.net..xxx.com |
经过词元(term)进行匹配,经过语言分析接口的实现,能够实现对中文等非英语的支持。 |
匹配度 |
没有匹配程度的控制:好比有记录中net出现5词和出现1次的,结果是同样的 |
有匹配度算法,将匹配程度(类似度)比较高的结果排在前面。 |
结果输出 |
返回全部的结果集,在匹配条目很是多的时候(好比上万条)须要大量的内存存放这些临时结果集。 |
经过特别的算法,将最匹配度最高的头100条结果输出,结果集是缓冲式的小批量读取的。 |
可定制性 |
没有接口或接口复杂,没法定制 |
经过不一样的语言分析接口实现,能够方便的定制出符合应用须要的索引规则(包括对中文的支持) |
结论 |
使用率低,模糊匹配规则简单或者须要模糊查询的资料量少 |
高负载的模糊查询应用,须要负责的模糊查询的规则,索引的资料量比较大 |
7、关于亚洲语言的的切分词问题(Word Segment)
对于中文来讲,全文索引首先还要解决一个语言分析的问题,对于英文来讲,语句中单词之间是自然经过空格分开的,但亚洲语言的中日韩文语句中的字是一个字挨一个,全部,首先要把语句中按“词”进行索引的话,这个词如何切分出来就是一个很大的问题。 首先,确定不能用单个字符做(si-gram)为索引单元,不然查“上海”时,不能让含有“海上”也匹配。 但一句话:“北京天安门”,计算机如何按照中文的语言习惯进行切分呢? “北京 天安门” 仍是“北 京 天安门”?让计算机可以按照语言习惯进行切分,每每须要机器有一个比较丰富的词库才可以比较准确的识别出语句中的单词。 另一个解决的办法是采用自动切分算法:将单词按照2元语法(bigram)方式切分出来,好比: "北京天安门" ==> "北京 京天 天安 安门"。 这样,在查询的时候,不管是查询"北京" 仍是查询"天安门",将查询词组按一样的规则进行切分:"北京","天安安门",多个关键词之间按与"and"的关系组合,一样可以正确地映射到相应的索引中。这种方式对于其余亚洲语言:韩文,日文都是通用的。