在Lucene 3.x时代,《Lucene In Action》是一本相当不错的参考书,书中详细介绍了Lucene各种高级使用技术,对于开发者来说非常实用。但是近期Lucene升级到了4.x版本,在性能等各方面有了很大的提高,值得在新项目中使用。然而Lucene 4.x中的API相比3.x来说有了很大的改变,《Lucene In Action》中的很多内容都已经过时了,并且由于4.x推出的时间不长,还没有比较好的文档来对用法进行说明,这个系列文章就是想记录下自己使用Lucene 4.x的经验体会,供大家参考使用。
由于现在网络搜索都希望达到实时搜索的效果,用户上传文章后,希望立即在搜索结果中可见,这就要求我们必须使用Lucene的准实时搜索功能,使我们在不影响性能的情况下达到近实时搜索的效果。然而准实时搜索API在4.x版本中已经与3.x版本完全不同了。
首先来看怎样获取准实时搜索的Reader实例,大家都知道,由于性能等方面原因,基于Lucene的应用一般都采用共享Lucene的Writer和Reader及Searcher的方案,我们这里也不例外:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
indexPathname = "D:/aproject/xincaigu/work/index" ;
analyzer = new MMSegAnalyzer();
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_41, analyzer);
iwc.setOpenMode(OpenMode.CREATE_OR_APPEND);
try {
indexDir = FSDirectory.open( new File(indexPathname));
writer = new IndexWriter(indexDir, iwc); // writer和reader整个程序共用
reader = DirectoryReader.open(writer, true );
//reader = writer.getReader();
} catch (CorruptIndexException e) {
} catch (LockObtainFailedException e) {
} catch (IOException e) {
}
|
熟悉Lucene 3.x的朋友一定注意到了,获取准实时搜索所用的Reader已经改用DirectoryReader.open方法,而不是3.x当中的writer.getReader()方法了。
同样,在3.x中,为了可以看到刚刚添加的新文章,Reader需要进行reopen操作,这是一种节省资源的方式,可以获取新加入索引的文章,而不需要将改动保存到磁盘上,然后重新打开索引的方式来进行了。但是reopne在4.x也被新API所取代,具体的用法如下所示:
1
2
3
4
5
6
7
8
9
10
|
try {
IndexReader newReader = DirectoryReader.openIfChanged((DirectoryReader)reader, writer, false ); //reader.reopen(); // 读入新增加的增量索引内容,满足实时索引需求
if (newReader != null ) {
reader.close();
reader = newReader;
}
searcher = new IndexSearcher(reader);
} catch (CorruptIndexException e) {
} catch (IOException e) {
}
|
这里首先利用新APIDirctoryReader.openIfChanged来获取Reader,如果有新内容,则返回新的Reader,这时我们需要关闭老的Reader。
通过以上代码,我们就可以利用Lucene 4.x的准实时搜索功能了。但是Lucene 4.x中API的变动远不止这些,在进行索引时,原来定义Field的方式已经过时,取而代之的是更加灵活的FieldType机制,下篇文章中我们将详细探讨如何在文本索引中使用这一新的机制。
http://my.oschina.net/MrMichael/blog/220723
相关推荐
《Ajax+Lucene构建搜索引擎》源代码是针对Lucene 2.x版本的一个示例项目,旨在教用户如何结合Ajax技术和Lucene搜索引擎库来创建高效的、交互式的搜索功能。Lucene是一个开源全文检索库,由Apache软件基金会开发,它...
- 创建IndexSearcher实例通常需要一个IndexReader,可以从目录中打开,如`DirectoryReader.open(FSDirectory.open(new File(index)))`。 - 分析器Analyzer用于处理文本,如`new StandardAnalyzer(Version.LUCENE_...
**Lucene.Net 2.3 知识点详解** Lucene.Net是一个开源的全文检索库,它...然而,随着技术的发展,建议升级到更高版本以获得更多的新功能和改进,例如Lucene.Net 4.x及以后的版本,它们提供了更好的性能和更多的特性。
《深入理解Lucene 5.x JdbcDirectory:Java数据库连接的索引存储之道》 在信息爆炸的时代,搜索引擎已经成为我们日常获取信息的重要工具。Apache Lucene作为一款强大的全文搜索引擎库,为开发者提供了丰富的功能,...
3. **lucene.jar**:早期版本的Lucene所有组件的集合,可能包含3.x版本的其他组件。在3.6.0之后,Lucene的模块化设计使得各个组件分别打包,因此单独的`lucene.jar`可能不再更新。 4. **lucene-highlighter-3.5.0....
4. **lucene-sandbox-4.7.x.jar**(可能):包含一些实验性的或者不稳定的特性。 5. **lucene-memory-4.7.x.jar**(可能):提供了内存索引,适用于需要快速创建和删除索引的场景。 6. **IKAnalyzer2012FF.jar**:IK...
这个源代码版本代表了Lucene 3.x系列的最后一个稳定版本,为开发者提供了深入理解Lucene内部机制的宝贵资源。下面将详细探讨Lucene 3.6.2中的关键知识点。 1. **分词器(Tokenizers)**: Lucene的核心功能之一是...
**使用Lucene全文检索...随着技术的发展,现在的Lucene已经发展到8.x版本,提供了更多功能和优化,例如支持更丰富的分析器、更高效的索引和查询机制等。对于新项目,建议使用较新版本的Lucene,以充分利用其最新特性。
需要注意的是,这里使用的Lucene版本是3.5.0,而最新版本已经发展到了8.x,这意味着一些API可能已经过时。对于新的项目,建议使用最新版本以获得更好的性能和新特性。不过,3.5.0版本仍能提供基本的搜索功能理解。 ...
最后,你可以创建一个查询服务类,使用Lucene的`IndexReader`和`IndexSearcher`来执行全文检索: ```java @Service public class LuceneSearchService { private final Directory directory; private final ...
on mac os x 10.3.1 (panther) powerbook g4 1ghz 1gb: . running with java 1.4.1_01-99 : 20379 ms . running with gcj 3.3.2 -O2 : 17842 ms . running clucene 0.8.9's demo : 9930 ms I recently did some...