在应用中加入全文检索功能
B@-"1m~la? ——基于Java的全文索引引擎Lucene简介
Y-]YDXrPQ 作者: 车东 Email: chedongATbigfoot.com/chedongATchedong.com
?[|hGR2L `#U ]iwW! 写于:2002/08 最后更新: 11/29/2006 17:23:30
4,zvFH*AH Feed Back >> (Read this before you ask question)
}!=U^A) avBu a6i' 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
C#$6O8O http://www.chedong.com/tech/lucene.html P\T| [%E' gY%&IHQ' 关键词:Lucene java full-text search engine Chinese word segment
+;6) !EM#m@kZ{ 内容摘要:
cUs L6y 8T7f[? Lucene是一个基于Java的全文索引工具包。
[?I/Uo8
Vrg3{@$ 基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史
C
Oa.xyp 全文检索的实现:Luene全文索引和数据库索引的比较
^Xa*lR 3 中文切分词机制简介:基于词库和自动切分词算法的比较
7t3X`db 具体的安装和使用简介:系统结构介绍和演示
^r4|{ Hacking Lucene:简化的查询分析器,删除的实现,定制的排序,应用接口的扩展
_k|g@" 从Lucene我们还可以学到什么
0 {,h.: 基于Java的全文索引/检索引擎——Lucene
V&R$8tpz .HCaXFW Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/
R=Ymo.zs6 x5PPu/ 检索功能。
/6jGt'^U tIp{},bQ^ Lucene的作者:Lucene的贡献者Doug Cutting是一位资深全文索引/检索专家,曾经是V-Twin搜索引擎(Apple的Copland操作系统的成就之一)的
<N-=fad] QXB|!' 主要开发者,后在Excite担任高级系统架构设计师,目前从事于一些INTERNET底层架构的研究。他贡献出的Lucene的目标是为各种中小型应用
gWi{\x8dt ZMe}M!V 程序加入全文检索功能。
=1/q)b,p) zv@bI~3~ Lucene的发展历程:早先发布在作者自己的
www.lucene.com,后来发布在SourceForge,2001年年底成为APACHE基金会jakarta的一个子项目:
K9*IA@xL u{P~zyx http://jakarta.apache.org/lucene/ w49{-Pp[ c>rKgx 已经有很多Java项目都使用了Lucene作为其后台的全文索引引擎,比较著名的有:
p_9g|B0D *(p7NYf1 Jive:WEB论坛系统;
}+_9"YQ: Eyebrows:邮件列表HTML归档/浏览/查询系统,本文的主要参考文档“TheLucene search engine: Powerful, flexible, and free”作者就是
{( dP }\VX^{ K j EyeBrows系统的主要开发者之一,而EyeBrows已经成为目前APACHE项目的主要邮件列表归档系统。
cafsMgrA Cocoon:基于XML的web发布框架,全文检索部分使用了Lucene
*.3y2m,bZ Eclipse:基于Java的开放开发平台,帮助部分的全文索引使用了Lucene
7O9n!aJ wsI5F&R, 对于中文用户来说,最关心的问题是其是否支持中文的全文检索。但通过后面对于Lucene的结构的介绍,你会了解到由于Lucene良好架构设计
1I
b_Kmb- B#:E?a;{ ,对中文的支持只需对其语言词法分析接口进行扩展就能实现对中文检索的支持。
`1q|F9D ]K*GSU 全文检索的实现机制
"]UIz_^'`U MISE C[/ Lucene的API接口设计的比较通用,输入输出结构都很像数据库的表==>记录==>字段,所以很多传统的应用的文件、数据库等都可以比较方便的
@sdS0pC $NdH* 映射到Lucene的存储结构/接口中。总体上看:可以先把Lucene当成一个支持全文索引的数据库系统。
R|-j]Ne VAg68EbnF 比较一下Lucene和数据库:
dxntGH< O `$M
etQ Lucene 数据库
mV%h[~- 索引数据源:doc(field1,field2...) doc(field1,field2...) \ indexer / _____________
]Ly8s#<g]N Pfk{ =y | Lucene Index| -------------- / searcher \ 结果输出:Hits(doc(field1,field2) doc
N"K\ick6J QheDF7'z (field1...))
p&uCp7]U 索引数据源:record(field1,field2...) record(field1..) \ SQL: insert/ _____________
a-:pJE.'p La]4/=a | DB Index | ------------- / SQL: select \结果输出:results(record(field1,field2..) record
z
7@ 'CJ hRLKb} (field1...))
POY=zUQ'/ 9':/Sab:7v Document:一个需要进行索引的“单元”
oAaf)?8 一个Document由多个字段组成 Record:记录,包含多个字段
^9s"FdB]24 Field:字段 Field:字段
E)Srj~$d Hits:查询结果集,由匹配的Document组成 RecordSet:查询结果集,由多个Record组成
Z>&K&ttJ -aT=f9u 全文检索 ≠ like "%keyword%"
3r`<(%\ .5NZf4:C 通常比较厚的书籍后面常常附关键词索引表(比如:北京:12, 34页,上海:3,77页……),它能够帮助读者比较快地找到相关内容的页码。
SKW;MVC {<r`5 而数据库索引能够大大提高查询的速度原理也是一样,想像一下通过书后面的索引查找的速度要比一页一页地翻内容高多少倍……而索引之所
GeVc\$K- @~hz_Nm@8 以效率高,另外一个原因是它是排好序的。对于检索系统来说核心是一个排序问题。
$^ubo5% %^T!@uZr 由于数据库索引不是为全文索引设计的,因此,使用like "%keyword%"时,数据库索引是不起作用的,在使用like查询时,搜索过程又变成类
rX:1_q`xA 38"cbHE3 似于一页页翻书的遍历过程了,所以对于含有模糊查询的数据库服务来说,LIKE对性能的危害是极大的。如果是需要对多个关键词进行模糊匹
n{3|E3 OFQ{9 配:like"%keyword1%" and like "%keyword2%" ...其效率也就可想而知了。
\wFhTJY 'cYQ?; 所以建立一个高效检索系统的关键是建立一个类似于科技索引一样的反向索引机制,将数据源(比如多篇文章)排序顺序存储的同时,有另外
ze
?CoDx2 u,\xok" 一个排好序的关键词列表,用于存储关键词==>文章映射关系,利用这样的映射关系索引:[关键词==>出现关键词的文章编号,出现次数(甚至
(c<