在Lucene 3.x时代,《Lucene In Action》是一本至关不错的参考书,书中详细介绍了Lucene各类高级使用技术,对于开发者来讲很是实用。可是近期Lucene升级到了4.x版本,在性能等各方面有了很大的提升,值得在新项目中使用。然而Lucene 4.x中的API相比3.x来讲有了很大的改变,《Lucene In Action》中的不少内容都已通过时了,而且因为4.x推出的时间不长,尚未比较好的文档来对用法进行说明,这个系列文章就是想记录下本身使用Lucene 4.x的经验体会,供你们参考使用。java
因为如今网络搜索都但愿达到实时搜索的效果,用户上传文章后,但愿当即在搜索结果中可见,这就要求咱们必须使用Lucene的准实时搜索功能,使咱们在不影响性能的状况下达到近实时搜索的效果。然而准实时搜索API在4.x版本中已经与3.x版本彻底不一样了。web
首先来看怎样获取准实时搜索的Reader实例,你们都知道,因为性能等方面缘由,基于Lucene的应用通常都采用共享Lucene的Writer和Reader及Searcher的方案,咱们这里也不例外:网络
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所取代,具体的用法以下所示:spa
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。code
经过以上代码,咱们就能够利用Lucene 4.x的准实时搜索功能了。可是Lucene 4.x中API的变更远不止这些,在进行索引时,原来定义Field的方式已通过时,取而代之的是更加灵活的FieldType机制,下篇文章中咱们将详细探讨如何在文本索引中使用这一新的机制。orm