文档章节

Lucene 4.x 之 IndexReader

一枚Sir
 一枚Sir
发布于 2014/04/10 16:28
字数 732
阅读 2019
收藏 5

在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的方案,我们这里也不例外:

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所取代,具体的用法如下所示:

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机制,下篇文章中我们将详细探讨如何在文本索引中使用这一新的机制。


© 著作权归作者所有

一枚Sir
粉丝 119
博文 209
码字总数 350904
作品 0
朝阳
架构师
私信 提问
Lucene.Net 的“System.IndexOutOfRangeException: 索引超出了数组界限”错误

堆栈信息如下 System.IndexOutOfRangeException: 索引超出了数组界限。 在 Lucene.Net.Search.AnonymousClassIntParser1.ParseInt(String val) 在 Lucene.Net.Search.FieldCacheImpl.IntCach......

范大脚脚
2017/11/22
0
0
Apache Lucene 3.5 发布,Java 搜索引擎

Apache Lucene 3.5 发布了,该版本包含大量的bug修复、优化以及改进,下载地址: http://www.apache.org/dyn/closer.cgi/lucene/java 完整改进内容请看下载后的 CHANGES.txt 文件。 Lucene 3...

红薯
2011/11/27
4K
5
lucene之索引创建

package org.itat.index; import java.io.File; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.u......

泡海椒
2015/12/02
19
0
Lucene学习笔记(二)

import java.io.IOException; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.SimpleAnalyzer; import org.apache.lucene.document.Document; import org.......

嗯哼9925
2017/12/26
0
0
LIRE的使用:搜索相似的图片

LIRE(Lucene Image REtrieval)提供一种的简单方式来创建基于图像特性的Lucene索引。利用该索引就能够构建一个基于内容的图像检索(content- based image retrieval,CBIR)系统,来搜索相似的...

雷霄骅
2013/09/20
630
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
5
0
CSS盒子模型

CSS盒子模型 组成: content --> padding --> border --> margin 像现实生活中的快递: 物品 --> 填充物 --> 包装盒 --> 盒子与盒子之间的间距 content :width、height组成的 内容区域 padd......

studywin
今天
7
0
修复Win10下开始菜单、设置等系统软件无法打开的问题

因为各种各样的原因导致系统文件丢失、损坏、被修改,而造成win10的开始菜单、设置等系统软件无法打开的情况,可以尝试如下方法解决 此方法只在部分情况下有效,但值得一试 用Windows键+R打开...

locbytes
昨天
8
0
jquery 添加和删除节点

本文转载于:专业的前端网站➺jquery 添加和删除节点 // 增加一个三和一节点function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(".triple-panel-con......

前端老手
昨天
8
0
一、Django基础

一、web框架分类和wsgiref模块使用介绍 web框架的本质 socket服务端 与 浏览器的通信 socket服务端功能划分: 负责与浏览器收发消息(socket通信) --> wsgiref/uWsgi/gunicorn... 根据用户访问...

ZeroBit
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部