fudoctor / Lucene / 基于Lucene部分功能的测试

分享

   

基于Lucene部分功能的测试

2012-03-09  fudoctor
206人阅读评论(1)收藏举报

组员:郭洁 张景云 路璐

 

1 项目概述

基于Lucene实现一个对文本文件的分词、去除禁用词、倒排索引创建和关键词搜索,并测试其性能


2 项目完成的基本思想

2.1 lucene环境配置

开发环境:Netbeans IDE 6.7

辅助工具:

apache-ant-1.8.0 lucene生成.jar文件,以加载到Netbeans 库中

2.2 分词和去除禁用词测试

Lucene里提供了四种英文分词方法,即WhitespaceAnalyzer,SimpleAnalyzer,StopAnalyzerStandardAnalyzer.下面测试一下这四种analyzer.

测试类AnalyzerDemo.javaAnalyzerUtils.java

主要代码:

//四种analyzer做成Analyzer[]数组,方便对比分析

private static final Analyzer[] analyzers = new Analyzer[]{

new WhitespaceAnalyzer(),

new SimpleAnalyzer(),

new StopAnalyzer(),

new StandardAnalyzer()

};

//从分析器中获取tokens

Token[] tokens = tokensFromAnalysis(analyzer, text);

运行结果:

1.四种analyzer的比较

分析第一个例子,A big black bear sat on a big black bug.

WhiteSpaceAnalyzer 只是把每个单词都分开

SimpleAnalyzer WhiteSpaceAnalyzer的基础上把大写字母转换成小写字母,并且去掉标点符号。

StopAnalyzer去除了停止词,例如a

StandardAnalyzer 的效果跟StopAnalyzer一样。

由上分析,StopAnalyzerStandardAnalyzer分析器更好一些。

再分析第二个例子,My E-mail address is tkrwy@126.com

对于符号“-”分析器都把它删去了,但是对于“@”我们不希望得到像StopAnalyzer那样的效果,更希望是像StandardAnalyzer那样的效果,所以最后选择StandardAnalyzer分析器,集分词、去除标点符号、大写字母转换为小写字母、去除stop word等为一体。

选择好分析器后,下面我们来创建索引。

2.3 创建索引测试

下图是项目文件夹,位于E:/数据工程/lucene1

2.项目文件夹

测试数据位于data文件夹下,1.txt2.txt。其中

1.txt内容:

A big black bear sat on a big black bug.

2.txt内容

My E-mail address is tkrwy@126.com.

创建索引

IndexFiles.java

关键代码:

//创建analyzer

Analyzer analyzer=new StandardAnalyzer(Version.LUCENE_CURRENT);

//创建IndexWriter

IndexWriter writer = new IndexWriter(FSDirectory.open(INDEX_DIR), analyzer, true, IndexWriter.MaxFieldLength.LIMITED);

netbeans下有参数运行项目。有参数运行方法:在项目属性下,主类选择IndexFiles,参数选择要建立索引的文件夹。如下图所示。

3.有参数运行项目

运行结果:

4.1创建索引后的输出结果

此时,在项目文件夹可以看出多了一个叫index的文件。

4.2 在项目文件下多了一个叫index的文件

Index下的文件:_0.cfs,_0.cfx,segments.gen,segments_2

4.3 index下的文件

索引创建好了,下面我们来进行搜索

2.4 关键词搜索测试

SearchFiles.java

关键代码:

//IndexSearcher: 搜索一个index的入口

IndexReader reader = IndexReader.open(FSDirectory.open(new File(index)), true);

Searcher searcher = new IndexSearcher(reader);

//StandardAnalyzer:分析器

Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT);

//QueryparserThe query parser just enables decoding the Lucene query syntax into the corresponding Query object

QueryParser parser = new QueryParser(field, analyzer);

Query query = parser.parse(line);

//执行Search.

searcher.search(query, collector);

有参数运行:java org.apache.lucene.demo.SearchFiles E:/数据工程/lucene1/index

5 有参数运行SearchFiles.java

运行结果:

6 查询结果

由图6可以看出:程序准确的查出了“tkrwy@126.com”所在的文档,并且支持带有通配符字符串的“tkrwy*”的查找。经过多次测试,通配符的查找要比全文查找要慢。


3 项目扩展

3.1 lucene优缺点

经查资料总结如下:

u 优点:

1、索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。

2、在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。

3、优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能

4、设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。

5、已经默认实现了一套强大的查询引擎,用户无需自己编写代码即使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询(Fuzzy Search)、分组查询等等。

u 缺点:

1Lucene 的内建不支持群集。

Lucene是作为嵌入式的工具包的形式出现的,在核心代码上没有提供对群集的支持。实现对Lucene的群集有三种方式:1、继承实现一个 Directory2、使用Solr 3、使用 Nutch+Hadoop;使用Solr不得不用他的Index Server ,而使用Nutch又不得不集成抓取的模块;

2、区间范围搜索速度非常缓慢;

Lucene的区间范围搜索,不是一开始就提供的是后来才加上的。对于在单个文档中term出现比较多的情况,搜索速度会变得很慢。因此作者称Lucene是一个高效的全文搜索引擎,其高效仅限于提供基本布尔查询 boolean queries

3、排序算法的实现不是可插拔的,因为贯穿Lucene的排序算法的tf/idf 的实现,尽管term是可以设置boost或者扩展LuceneQuery类,但是对于复杂的排序算法定制还是有很大的局限性;

4Lucene的结构设计不好;

LuceneOO设计的非常糟,尽管有包package和类class,但是Lucene的设计基本上没有设计模式的身影。这是不是c或者c++程序员写java程序的通病?

ALucene中没有使用接口Interface,比如Query ( BooleanQuery, SpanQuery, TermQuery...) 大都是从超类中继承下来的;

BLucene的迭代实现不自然: 没有hasNext() 方法, next() 返回一个布尔值 boolean然后刷新对象的上下文;

5、封闭设计的API使得扩展Lucene变得很困难;

6、参考第4,Lucene的搜索算法不适用于网格计算;


4 项目总结

大部分的搜索(数据库)引擎都是用B树结构来维护索引,索引的更新会导致大量的IO操作,Lucene在实现中,对此稍微有所改进:不是维护一个索引文件,而是在扩展索引的时候不断创建新的索引文件,然后定期的把这些新的小索引文件合并到原先的大索引中(针对不同的更新策略,批次的大小可以调整),这样在不影响检索的效率的前提下,提高了索引的效率.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多
    喜欢该文的人也喜欢 更多

    ×
    ×

    ¥.00

    微信或支付宝扫码支付:

    开通即同意《个图VIP服务协议》

    全部>>