在应用中加入全文检索功能
NPe%F+X ——基于Java的全文索引引擎Lucene简介
s}% M4 作者: 车东 Email: chedongATbigfoot.com/chedongATchedong.com
P}7 'm
M fx>4 写于:2002/08 最后更新: 11/29/2006 17:23:30
p"ZG%Ow5Q] Feed Back >> (Read this before you ask question)
w=J3=T@TD 1HZO9cXJ 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
';=O 0)u http://www.chedong.com/tech/lucene.html =rCIumqD-} pD#rnp>WWt 关键词:Lucene java full-text search engine Chinese word segment
e&aWq@D r?
E)obE 内容摘要:
Da&]y fDU!~/# Lucene是一个基于Java的全文索引工具包。
V /V9B2.$ [^98fAlz6 基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史
7Da` 全文检索的实现:Luene全文索引和数据库索引的比较
}2<7%FL 中文切分词机制简介:基于词库和自动切分词算法的比较
1Z~FCJz 具体的安装和使用简介:系统结构介绍和演示
lv+TD!b Hacking Lucene:简化的查询分析器,删除的实现,定制的排序,应用接口的扩展
b7?hI 从Lucene我们还可以学到什么
(c
&mCJN 基于Java的全文索引/检索引擎——Lucene
8C9-_Ng` "u^H#L>-q Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/
P! #[mio +s DV~\Vu 检索功能。
T <ET
)D7 &AbNWtCV+G Lucene的作者:Lucene的贡献者Doug Cutting是一位资深全文索引/检索专家,曾经是V-Twin搜索引擎(Apple的Copland操作系统的成就之一)的
*.d)OOpLo 8&`LYdzt 主要开发者,后在Excite担任高级系统架构设计师,目前从事于一些INTERNET底层架构的研究。他贡献出的Lucene的目标是为各种中小型应用
J,y[[CdH`
=.]4;z 程序加入全文检索功能。
SmSH2m- U/l&tmIVY Lucene的发展历程:早先发布在作者自己的
www.lucene.com,后来发布在SourceForge,2001年年底成为APACHE基金会jakarta的一个子项目:
6.nCV0xA s{\8om'- http://jakarta.apache.org/lucene/ EE'io5\et +Kbjzh3<wG 已经有很多Java项目都使用了Lucene作为其后台的全文索引引擎,比较著名的有:
iVq'r4S F%D.zvKN Jive:WEB论坛系统;
XXn67sF/ Eyebrows:邮件列表HTML归档/浏览/查询系统,本文的主要参考文档“TheLucene search engine: Powerful, flexible, and free”作者就是
sZ/v^xk 0*D$R`$ EyeBrows系统的主要开发者之一,而EyeBrows已经成为目前APACHE项目的主要邮件列表归档系统。
WuUk9_g Cocoon:基于XML的web发布框架,全文检索部分使用了Lucene
zL `iK"N` Eclipse:基于Java的开放开发平台,帮助部分的全文索引使用了Lucene
MC.)2B7 ofw3S|F6 对于中文用户来说,最关心的问题是其是否支持中文的全文检索。但通过后面对于Lucene的结构的介绍,你会了解到由于Lucene良好架构设计
V7fq4O^: ::{Q1F ,对中文的支持只需对其语言词法分析接口进行扩展就能实现对中文检索的支持。
2?ez,*-[ UIN<2F_ 全文检索的实现机制
]{mPh\ !/i{l Lucene的API接口设计的比较通用,输入输出结构都很像数据库的表==>记录==>字段,所以很多传统的应用的文件、数据库等都可以比较方便的
}.m< =QiI :|eRA 映射到Lucene的存储结构/接口中。总体上看:可以先把Lucene当成一个支持全文索引的数据库系统。
++Ts V_}"+&W9 比较一下Lucene和数据库:
Mc_YPR:C 9u}Hmb Lucene 数据库
lbl?k5 索引数据源:doc(field1,field2...) doc(field1,field2...) \ indexer / _____________
a>I+]`g _
y8Wn}19f | Lucene Index| -------------- / searcher \ 结果输出:Hits(doc(field1,field2) doc
o5uph=Q{ peuZ&yK+" (field1...))
Ep3N&Imp 索引数据源:record(field1,field2...) record(field1..) \ SQL: insert/ _____________
$OkBg0 9oR@UW1 | DB Index | ------------- / SQL: select \结果输出:results(record(field1,field2..) record
^sEYOX\ PB`Y
g (field1...))
jrr*!^4| 4`]^@"{ Document:一个需要进行索引的“单元”
,|H
`e^ 一个Document由多个字段组成 Record:记录,包含多个字段
}1i`6`y1 Field:字段 Field:字段
VfC <WVYiZ Hits:查询结果集,由匹配的Document组成 RecordSet:查询结果集,由多个Record组成
&zeyE;/Hj O6a<`]F 全文检索 ≠ like "%keyword%"
_w+:Dv~*a ?u=Fj_N_ 通常比较厚的书籍后面常常附关键词索引表(比如:北京:12, 34页,上海:3,77页……),它能够帮助读者比较快地找到相关内容的页码。
j8{i#;s!" qqr?!vem6 而数据库索引能够大大提高查询的速度原理也是一样,想像一下通过书后面的索引查找的速度要比一页一页地翻内容高多少倍……而索引之所
f:|1_ j 6J6BF% 以效率高,另外一个原因是它是排好序的。对于检索系统来说核心是一个排序问题。
.A{tQ1&_ QIvVcfM^ 由于数据库索引不是为全文索引设计的,因此,使用like "%keyword%"时,数据库索引是不起作用的,在使用like查询时,搜索过程又变成类
{e9@- JZ*/,|1}EC 似于一页页翻书的遍历过程了,所以对于含有模糊查询的数据库服务来说,LIKE对性能的危害是极大的。如果是需要对多个关键词进行模糊匹
ju8q?Nyhs 6x[}g 配:like"%keyword1%" and like "%keyword2%" ...其效率也就可想而知了。
A _
N;
ZC`wO%, 所以建立一个高效检索系统的关键是建立一个类似于科技索引一样的反向索引机制,将数据源(比如多篇文章)排序顺序存储的同时,有另外
%wvdn a /l)qB# 一个排好序的关键词列表,用于存储关键词==>文章映射关系,利用这样的映射关系索引:[关键词==>出现关键词的文章编号,出现次数(甚至
0s3%Kqi[ g:D>.lKd 包括位置:起始偏移量,结束偏移量),出现频率],检索过程就是把模糊查询变成多个可以利用索引的精确查询的逻辑组合的过程。从而大大
|[ k.ii6iO R0]1xGz 提高了多关键词查询的效率,所以,全文检索问题归结到最后是一个排序问题。
(\hx` Yh=> i8[t=6Rm@ 由此可以看出模糊查询相对数据库的精确查询是一个非常不确定的问题,这也是大部分数据库对全文检索支持有限的原因。Lucene最核心的特
q#ClnG* %D}kD6= 征是通过特殊的索引结构实现了传统数据库不擅长的全文索引机制,并提供了扩展接口,以方便针对不同应用的定制。
aweV#j(y {V$|3m>:* 可以通过一下表格对比一下数据库的模糊查询:
D4-ifsP O%zU-_|* Lucene全文索引引擎 数据库
Cc' 37~6~P 索引 将数据源中的数据都通过全文索引一一建立反向索引 对于LIKE查询来说,数据传统的索引是根本用不上的。数据需要逐个便利记录进行
8 \ +T8(m G"U9E5O GREP式的模糊匹配,比有索引的搜索速度要有多个数量级的下降。
YYl 4"l 匹配效果 通过词元(term)进行匹配,通过语言分析接口的实现,可以实现对中文等非英语的支持。 使用:like "%net%" 会把netherlands也
~tUl} kmsb hYM) 匹配出来,
so)[59M7
多个关键词的模糊匹配:使用like "%com%net%":就不能匹配词序颠倒的xxx.net..xxx.com
&5spTMw8 匹配度 有匹配度算法,将匹配程度(相似度)比较高的结果排在前面。 没有匹配程度的控制:比如有记录中net出现5词和出现1次的,结果是
ZQoU3AD; @qqg e' 一样的。
6YLj^w] % 结果输出 通过特别的算法,将最匹配度最高的头100条结果输出,结果集是缓冲式的小批量读取的。 返回所有的结果集,在匹配条目非常多的
)72+\C[*~r YY((V@|K 时候(比如上万条)需要大量的内存存放这些临时结果集。
nE&