1、基于Java的全文检索引擎的简介
Lucene不是一个完整的全文检索应用,而是一个java语言写的全文检索引擎工具包,他可以很方便的嵌入到各种应用系统中实现信息的全文检索功能。
2、全文检索实现机制
Lucene的api输入输出结构很想数据库的表、记录、字段,因此很多传统的应用中的文件、数据库可以很方便的把数据映射到Lucene的存储结构中,我们可以把Lucene当成一个支持全文索引的数据库系统。
下面我们比较一下Lucene和数据库
Lucene database
索引数据源 document(field1,field2....).. record(field1,field2...)..
| inder | sql:insert
lucene index database index
|search |select
Hits(docuemnt(field1,field2...)..) results(record(field1,field2...)..)
一个document有多个字段组成,是一个需要进行索引的单元,hits查询结果集。
数据库索引能够大大的帮助我们提高查询的速度,而索引之所以相对查询起高校作用,原因就在于它是排好序的,对于检索系统来说核心是核心是一个排序问题。
数据的索引不是为全文索引设计的,所以在sql中使用like %进行模糊查询时,数据库的索引是不起作用的,对于需要对外提供高效服务的服务的服务器来说,这是个致命的危害。所以建立一个高效的检索系统的关键时建立一个与反向索引类似的机制,将数据源排序存储的同时,有另一个排好序的关键词列表,用于存储关键词和内容的映射关系。检索过程就是把模糊查询变成多个可以利用索引的精确查询的逻辑组合的过程,从而大大的提高了关键词查询到的效率,所以全文检索问题归结到第就是一个排序问题。
Lucene最核心的特征是通过特殊的索引结构实现了传统数据库不擅长的全文索引机制。
3、Lucene与数据库的模糊查询的简单比较:
索引:Lucene将数据源中的数据通过全文索引一一建立反向索引。数据库对于like模糊查询而言,在数据检索时索引根本用不了的。
结果输出:Lucene通过特别的算法,将匹配度最高的前100条结果集输出,结果集是缓冲式的小批量读取。而数据库返回所有的结果集,在匹配条目多的时候,需要大量的内存存放这些临时结果集。
从上面可以总结出:Lucene和database最大的不同的在于让与用户查询的数据匹配的前100条结果满足98%以上用户的需求。
4、Lucene的创新之处
大部分的搜索引擎都是用B树来维护索引,索引的更新会导致大量的io操作,Lucene在实现中对此稍微做了改进,不是维护一个索引文件,而是在扩展索引的时候不断创建新的索引文件,然后定期的把这些小索引文件合并到原先的大的索引文件中,这样在不影响检索效率的前提下,提高了索引的效率。
Lucene 的详细介绍:请点这里
Lucene 的下载地址:请点这里
Lucene + Hadoop 分布式搜索运行框架 Nut 1.0a9