1. 什么是lucene
Apache Lucene是一个开放源程序的搜寻器引擎,利用它可以轻易地为Java软件加入全文搜寻功能。Lucene的最主要工作是替文件的每一个字作索引,索引让搜寻的效率比传统的逐字比较大大提高,Lucen提供一组解读,过滤,分析文件,编排和使用索引的API,它的强大之处除了高效和简单外,是最重要的是使使用者可以随时应自已需要自订其功能。 Lucene是apache软件基金会项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。
2. Lucene能做什么
Lucene使你可以为你的应用程序添加索引和搜索能力。Lucene可以索引并能使得可以转换成文本格式的任何数据能够被搜索。Lucene并不关心数据的来源、格式甚至它的语言,只要你能将它转换为文本。这就意味着你可经索引并搜索存放于文件中的数据:在远程服务器上的web页面,存于本地文件系统的文档,简单的文本文件,微软Word文档,HTML或PDF文件或任何其它能够提取出文本信息的格式。
同样,利用Lucene你可以索引存放于数据库中的数据,提供给用户很多数据库没有提供的全文搜索的能力。一旦你集成了Lucene,你的应用程序的用户就能够像这样来搜索:+George +Rice –eat –pudding, Apple –pie +Tiger, animal:monkey AND food:banana等等。利用Lucene,你可以索引和搜索email邮件,邮件列表档案,即时聊天记录,你的Wiki页面……等等更多。
3. Lucene的优点
(1)索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。
(2)在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。Lucene提供了索引的扩展机制,因此索引可以动态扩展。
(4)设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。
(5)已经默认实现了一套强大的查询引擎,用户无需自己编写代码即使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询、分组查询等等。
(6)搜索过程优化。Lucene面向全文检索的优化在于首次索引检索后,并不把所有的记录(Document)具体内容读取出来,而起只将所有结果中匹配度最高的头100条结果(TopDocs)的ID放到结果集缓存中并返回。
(7)Lucene的另外一个特点是在收集结果的过程中将匹配度低的结果自动过滤掉了。这也是和数据库应用需要将搜索的结果全部返回不同之处
4. 查询相关
Analyzer是分析器,它的作用是把一个字符串按某种规则划分成一个个词语,并去除其中的无效词语,这里说的无效词语是指英文中的“of”、 “the”,中文中的“的”、“地”等词语,这些词语在文章中大量出现,但是本身不包含什么关键信息,去掉有利于缩小索引文件、提高效率、提高命中率。
分词的规则千变万化,但目的只有一个:按语义划分。这点在英文中比较容易实现,因为英文本身就是以单词为单位的,已经用空格分开;而中文则必须以某种方法将连成一片的句子划分成一个个词语。
(1) 用通配符进行搜索
单个任意字符匹配的是所有可能单个字符。例如,搜索"text或者"test",可以这样:te?t
多个任意字符匹配的是0个及更多个可能字符。例如,搜索test, tests 或者 tester,可以这样:test*
您也可以在字符窜中间使用多个任意字符通配符。te*t
注意:您不能在搜索的项开始使用*或者?符号。
(2) 模糊查询
Lucene支持基于Levenshtein Distance与Edit Distance算法的模糊搜索。要使用模糊搜索只需要在单独项的最后加上符号"~"。例如搜索拼写类似于"roam"的项这样写:roam~
这次搜索将找到形如foam和roams的单词。
注意:使用模糊查询将自动得到增量因子(boost factor)为0.2的搜索结果.
(3) 布尔操作符
布尔操作符可将项通过逻辑操作连接起来。Lucene支持AND, "+", OR, NOT 和 "-"这些操作符。(注意:布尔操作符必须全部大写)
(4) 转义特殊字符
Lucene支持转义特殊字符,因为特殊字符是查询语法用到的。现在,特殊字符包括
+ - && || ! ( ) { } [ ] ^ " ~ * ? : "
转义特殊字符只需在字符前加上符号",例如搜索(1+1):2,使用查询
"(1"+1")":2
5. 一些使用经验
(1) 关键词区分大小写
OR AND TO等关键词是区分大小写的,lucene只认大写的,小写的当做普通单词。
(2) 读写互斥性
同一时刻只能有一个对索引的写操作,在写的同时可以进行搜索。
(3) 文件锁
在写索引的过程中强行退出将在tmp目录留下一个lock文件,使以后的写操作无法进行,可以将其手工删除。
(4) 时间格式
lucene只支持一种时间格式yyMMddHHmmss,所以你传一个yy-MM-dd HH:mm:ss的时间给lucene它是不会当作时间来处理的。
(5) 索引更新
lucene不支持索引更新,必须是先删除再新建索引,如果数据量很大且更新快则相当麻烦,本身建立索引是个漫长的过程,同时相当耗内存且很伤disk,不能实时的满足查询。
(6) 中间取索引
lucene不支持从中间取索引。例如:用户取第十页,lucene需要把前面所有的内容都要检索出,然后所有的排序,过滤掉前面的然后返回。
(7) 英文查询
若查询英文,比如有一句话:jiangxi strong 如果你输入jiang或者stron等不完整的一个词,将不能查询出结果,当你输入jiangxi或者strong才能查询出结果。
posted on 2008-10-31 17:33
老丁 阅读(2679)
评论(0) 编辑 收藏 所属分类:
搜索引擎 lucene