Lucene 4.x实践1

在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. indexPathname = "D:/aproject/xincaigu/work/index";  
  2.         analyzer = new MMSegAnalyzer();  
  3.         IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_41, analyzer);  
  4.         iwc.setOpenMode(OpenMode.CREATE_OR_APPEND);  
  5.         try {  
  6.             indexDir = FSDirectory.open(new File(indexPathname));   
  7.             writer = new IndexWriter(indexDir, iwc);  // writer和reader整个程序共用  
  8.             reader = DirectoryReader.open(writer, true);  
  9.             //reader = writer.getReader();  
  10.         } catch (CorruptIndexException e) {  
  11.         } catch (LockObtainFailedException e) {  
  12.         } catch (IOException e) {  
  13.         }  


熟悉Lucene 3.x的朋友一定注意到了,获取准实时搜索所用的Reader已经改用DirectoryReader.open方法,而不是3.x当中的writer.getReader()方法了。

 

同样,在3.x中,为了可以看到刚刚添加的新文章,Reader需要进行reopen操作,这是一种节省资源的方式,可以获取新加入索引的文章,而不需要将改动保存到磁盘上,然后重新打开索引的方式来进行了。但是reopne在4.x也被新API所取代,具体的用法如下所示:

 

  1. try {  
  2.             IndexReader newReader = DirectoryReader.openIfChanged((DirectoryReader)reader, writer, false);//reader.reopen();      // 读入新增加的增量索引内容,满足实时索引需求  
  3.             if (newReader != null) {  
  4.                 reader.close();  
  5.                 reader = newReader;  
  6.             }  
  7.             searcher = new IndexSearcher(reader);  
  8.         } catch (CorruptIndexException e) {  
  9.         } catch (IOException e) {  
  10.         }  


这里首先利用新APIDirctoryReader.openIfChanged来获取Reader,如果有新内容,则返回新的Reader,这时我们需要关闭老的Reader。

 

通过以上代码,我们就可以利用Lucene 4.x的准实时搜索功能了。但是Lucene 4.x中API的变动远不止这些,在进行索引时,原来定义Field的方式已经过时,取而代之的是更加灵活的FieldType机制,下篇文章中我们将详细探讨如何在文本索引中使用这一新的机制。

posted @ 2013-12-25 14:07  郑文亮  阅读(656)  评论(0编辑  收藏  举报