📄 1658.html
字号:
name=header_r1_c1></A></TD>
<TD colSpan=3>
<form action="http://www.linuxhero.com/docs/search.html" method=get>
<table
style="BORDER-RIGHT: #c4c4c4 1px solid; BORDER-TOP: #c4c4c4 1px solid; BORDER-LEFT: #c4c4c4 1px solid; BORDER-BOTTOM: #c4c4c4 1px solid"
cellspacing=0 cellpadding=3 width="95%" border=0 align="center">
<tbody>
<tr>
<td noWrap background="images/bgline.gif" tppabs="http://www.linuxhero.com/docs/images/bgline.gif">
<div align=center><font class=normalfont>搜索文章:
<input type=hidden value=result name=action2>
<input type=radio checked value=title name=type>标题
<input type=radio value=content name=type>内容
<input type=image src="images/button_go.gif" tppabs="http://www.linuxhero.com/docs/images/button_go.gif" border=0 name=image2>
</font></div>
</td>
</tr>
<tr>
<td noWrap>
<div align="center">
<input maxlength=100 size=30 name=keyword2>
</div>
</td>
</tr></tbody>
</table>
</form>
</TD>
<TD rowSpan=2><IMG src="images/header_r1_c7.gif" tppabs="http://www.linuxhero.com/docs/images/header_r1_c7.gif" width=26 border=0 name=header_r1_c7></TD>
<TD><IMG height=83 src="images/spacer.gif" tppabs="http://www.linuxhero.com/docs/images/spacer.gif" width=1 border=0></TD></TR>
<TR>
<TD background="images/bgline.gif" tppabs="http://www.linuxhero.com/docs/images/bgline.gif"><IMG height=22
src="images/header_r2_c1.gif" tppabs="http://www.linuxhero.com/docs/images/header_r2_c1.gif" width=296 border=0
name=header_r2_c1></TD>
<TD background="images/bgline.gif" tppabs="http://www.linuxhero.com/docs/images/bgline.gif" colSpan=5>
<DIV align=right><FONT class=normalfont>当前位置:
<A href="index.html" tppabs="http://www.linuxhero.com/docs/index.html">本站首页</A>
<font color="#FF6699">>></font>
<A href="type26.html" tppabs="http://www.linuxhero.com/docs/type26.html">其他服务</A> | <A href="copyright.html" tppabs="http://www.linuxhero.com/docs/copyright.html">版权说明</A></font></DIV>
</TD>
<TD><IMG height=22 src="images/spacer.gif" tppabs="http://www.linuxhero.com/docs/images/spacer.gif" width=1
border=0></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=10 cellPadding=0 width="100%" bgColor=#ffffff
border=0>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=3 width="100%" border=0>
<TR>
<TD vAlign=top align=middle width="60%">
<TABLE cellSpacing=0 cellPadding=0 width="100%"
background="images/back.gif" tppabs="http://www.linuxhero.com/docs/images/back.gif" border=0>
<TBODY>
<TR>
<TD vAlign=top width="80%">
<DIV align=center>
<FORM action="search.html" tppabs="http://www.linuxhero.com/docs/search.html" method=get>
</FORM>
<TABLE cellSpacing=0 cellPadding=0 width="95%"
border=0><TBODY>
<TR>
<TD background="images/bgi.gif" tppabs="http://www.linuxhero.com/docs/images/bgi.gif"
height=30></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=3 width="95%"
align=center border=0>
<TBODY>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=3 width="100%"
border=0>
<TBODY>
<TR>
<TD vAlign=top>
<p><FONT class=normalfont><B><font color=blue>在应用中加入全文检索功能</font></B></FONT><BR><FONT class=smallfont color=#ff9900>2004-04-23 15:18 pm</FONT><BR><FONT class=normalfont>作者:车东(chedong@bigfoot.com)<br>来自:Linux知识宝库<br>联系方式:无名<br><br> ——基于JAVA的全文索引引擎Lucene简介<br>
http://www.chedong.com/tech/lucene.html<br>
<br>
作者: 车东 chedong@bigfoot.com<br>
<br>
最后更新:2002-12-28 21:03:50<br>
<br>
版权声明:可以任意转载,转载时请务必标明原始出处和作者信息<br>
<br>
关键词:Lucene java full-text search engine Chinese word segment<br>
<br>
内容摘要:Lucene是一个基于JAVA的全文索引工具包。<br>
<br>
1. 基于JAVA的全文索引引擎Lucene简介:关于作者和Lucene的历史<br>
2. 全文检索的实现:Luene全文索引和数据库索引的比较<br>
3. 中文切分词机制简介:基于词库和自动切分词算法的比较<br>
4. 具体的安装和使用简介:系统结构介绍和演示<br>
5. Hacking Lucene:简化的查询分析器,删除的实现,定制的排序,应用接口的扩展<br>
6. 从Lucene我们还可以学到什么<br>
<br>
基于JAVA的全文索引/检索引擎——Lucene<br>
<br>
Lucene不是一个完整的全文索引应用,而是是一个用JAVA写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。<br>
<br>
Lucene的作者:Lucene的贡献者Doug Cutting是一位资深全文索引/检索专家,曾经是V-Twin搜索引擎(Apple的Copland操作系统的成就之一)的主要开发者,后在Excite担任高级系统架构设计师,目前从事于一些INTERNET底层架构的研究。他贡献出的Lucene的目标是为各种中小型应用程序加入全文检索功能。<br>
<br>
Lucene的发展历程:早先发布在作者自己的www.Lucene.com,后来发布在SOURCEFORGE,2001年年底成为APACHE基金会jakarta的一个子项目:http://jakarta.apache.org/lucene/<br>
<br>
基于Lucene的应用:<br>
已经有很多JAVA项目都使用了Lucene作为其后台的全文索引引擎,比较著名的有:<br>
<br>
* Jive:WEB论坛系统;<br>
* Eyebrows:邮件列表HTML归档/浏览/查询系统,本文的主要参考文档“The Lucene search engine: Powerful, flexible, and free”作者就是EyeBrows系统的主要开发者之一,而EyeBrows已经成为目前APACHE项目的主要邮件列表归档系统。<br>
* Cocoon: 基于XML的web发布框架,全文检索部分使用了Lucene<br>
*<br>
<br>
Eclipse: 基于Java的开放开发平台,帮助部分的全文索引使用了Lucene<br>
<br>
对于中文用户来说,最关心的问题是其是否支持中文的全文检索。但通过后面对于Lucene的结构的介绍,你会了解到由于Lucene良好架构设计,对中文的支持只需对其语言词法分析接口进行扩展就能实现对中文检索的支持。<br>
<br>
全文检索的实现机制<br>
<br>
Lucene的API接口设计的比较通用,输入输出结构都很像数据库的表==>记录==>字段,所以很多传统的应用的文件、数据库等都可以比较方便的映射到Lucene的存储结构/接口中。总体上看:可以先把Lucene当成一个支持全文索引的数据库系统。<br>
<br>
比较一下Lucene和数据库:<br>
Lucene 数据库<br>
<br>
索引数据源:doc(field1,field2...) doc(field1,field2...)<br>
indexer /<br>
_____________<br>
| Lucene Index|<br>
--------------<br>
/ searcher <br>
结果输出:Hits(doc(field1,field2) doc(field1...))<br>
<br>
索引数据源:record(field1,field2...) record(field1..)<br>
SQL: insert/<br>
_____________<br>
| DB Index |<br>
-------------<br>
/ SQL: select <br>
结果输出:results(record(field1,field2..) record(field1...))<br>
<br>
Document:一个需要进行索引的“单元”<br>
一个Document由多个字段组成 Record:记录,包含多个字段<br>
Field:字段 Field:字段<br>
Hits:查询结果集,由匹配的Document组成 RecordSet:查询结果集,由多个Record组成<br>
<br>
全文检索 ≠ like "%keyword%"<br>
<br>
通常比较厚的书籍后面常常附关键词索引表(比如:北京:12, 34页, 上海:3, 77页……),它能够帮助读者比较快地找到相关内容的页码。而数据库索引能够大大提高查询的速度原理也是一样,想像一下通过书后面的索引查找的速度要比一页一页地翻内容高多少倍……而索引之所以效率高,另外一个原因是它是排好序的。对于检索系统来说核心是一个排序问题。<br>
<br>
由于数据库索引不是为全文索引设计的,因此,使用like "%keyword%"时,数据库索引是不起作用的,在使用like查询时,搜索过程又变成类似于一页页翻书的遍历过程了,所以对于含有模糊查询的数据库服务来说,LIKE对性能的危害是极大的。如果是需要对多个关键词进行模糊匹配:like "%keyword1%" and like "%keyword2%" ...其效率也就可想而知了。<br>
<br>
所以建立一个高效检索系统的关键是建立一个类似于科技索引一样的反向索引机制,将数据源(比如多篇文章)排序顺序存储的同时,有另外一个排好序的关键词列表,用于存储关键词==>文章映射关系,利用这样的映射关系索引:[关键词==>出现关键词的文章编号,出现次数(甚至包括位置:起始偏移量,结束偏移量),出现频率],检索过程就是把模糊查询变成多个可以利用索引的精确查询的逻辑组合的过程。从而大大提高了多关键词查询的效率,所以,全文检索问题归结到最后是一个排序问题。<br>
<br>
由此可以看出模糊查询相对数据库的精确查询是一个非常不确定的问题,这也是大部分数据库对全文检索支持有限的原因。Lucene最核心的特征是通过特殊的索引结构实现了传统数据库不擅长的全文索引机制,并提供了扩展接口,以方便针对不同应用的定制。<br>
<br>
可以通过一下表格对比一下数据库的模糊查询:<br>
Lucene全文索引引擎 数据库<br>
索引 将数据源中的数据都通过全文索引一一建立反向索引 对于LIKE 查询来说,数据传统的索引是根本用不上的。数据需要逐个便利记录进行GREP式的模糊匹配,比有索引的搜索速度要有多个数量级的下降。<br>
匹配效果 通过词元(term)进行匹配,通过语言分析接口的实现,可以实现对中文等非英语的支持。 使用:like "%net%" 会把netherlands也匹配出来,<br>
多个关键词的模糊匹配:使用like "%com%net%":就不能匹配词序颠倒的xxx.net..xxx.com<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -