避免每次检索都使用DirectoryReader.open()
2015-09-08 13:36
197 查看
反复使用DirectoryReader.open()会产生很大开销,所以应尽可能复用之前打开的IndexReader,可以使用单例模式,但要注意,当索引被修改了,之前打开的indexReader也不会更新,如下面的单例模式:
publicclass TestIndexReader
{
privatestatic Directory directory = null;
privatestatic IndexReader indexReader = null;
static {
try {
directory =
FSDirectory.open(new File("D:\\lucene\\index"));
} catch (IOException
e) {
e.printStackTrace();
}
}
public IndexSearcher
getSearcher() throws IOException{
if(indexReader==null)
indexReader =
DirectoryReader.open(directory);
returnnew IndexSearcher(indexReader);
}
}
索引被修改以后,indexReader得不到更新,这样的话只能等到程序重启才有机会读取更新后的内容。
DirectoryReader提供了一个openIfChanged方法,这样的话我们可以判断索引是否被修改,如果被修改了,那么先把原来的indexReader关闭,重新打开新的IndexReader,如:
publicclass TestIndexReader
{
privatestatic Directory directory = null;
privatestatic IndexReader indexReader = null;
static {
try {
directory =
FSDirectory.open(new File("D:\\lucene\\index"));
} catch (IOException
e) {
e.printStackTrace();
}
}
public IndexSearcher
getSearcher() throws IOException{
if(indexReader==null)
indexReader =
DirectoryReader.open(directory);
else{
IndexReader changeReader = DirectoryReader.openIfChanged((DirectoryReader)indexReader);
if(changeReader!=null){
indexReader.close();
indexReader =
changeReader;
}
}
returnnew IndexSearcher(indexReader);
}
}
publicclass TestIndexReader
{
privatestatic Directory directory = null;
privatestatic IndexReader indexReader = null;
static {
try {
directory =
FSDirectory.open(new File("D:\\lucene\\index"));
} catch (IOException
e) {
e.printStackTrace();
}
}
public IndexSearcher
getSearcher() throws IOException{
if(indexReader==null)
indexReader =
DirectoryReader.open(directory);
returnnew IndexSearcher(indexReader);
}
}
索引被修改以后,indexReader得不到更新,这样的话只能等到程序重启才有机会读取更新后的内容。
DirectoryReader提供了一个openIfChanged方法,这样的话我们可以判断索引是否被修改,如果被修改了,那么先把原来的indexReader关闭,重新打开新的IndexReader,如:
publicclass TestIndexReader
{
privatestatic Directory directory = null;
privatestatic IndexReader indexReader = null;
static {
try {
directory =
FSDirectory.open(new File("D:\\lucene\\index"));
} catch (IOException
e) {
e.printStackTrace();
}
}
public IndexSearcher
getSearcher() throws IOException{
if(indexReader==null)
indexReader =
DirectoryReader.open(directory);
else{
IndexReader changeReader = DirectoryReader.openIfChanged((DirectoryReader)indexReader);
if(changeReader!=null){
indexReader.close();
indexReader =
changeReader;
}
}
returnnew IndexSearcher(indexReader);
}
}
相关文章推荐
- hdu 4405 Aeroplane chess(概率+dp)
- Linux孤儿进程与僵尸进程
- [引] Security tips for web developers
- linux Ubuntu的root权限开通
- Linux下查看文件和文件夹大小
- GO 1.5 代码编译安装 [centos7 64位]
- hadoop权威指南(第四版)要点翻译(6)——Chapter 4. YARN(1)
- POJ 2976 Dropping tests(最大化平均值)
- armv7架构下lubuntu系统apt-get安装ffmpeg方法
- (转)Linux上的Shebang符号(#!)
- layoutopt + Improving Your Code with lint
- openGL 自定义矩阵
- 【win10+vs2013+opencv3.0安装与配置的详细过程】
- Linux命令学习(三)-配置有线网卡ip地址
- shell 打印偶数行奇数行
- Linux 编程和系统管理新手入门
- shell脚本 函数传递参数
- myeclipse6.5配置tomcat7
- Myeclipse6.5 显示tomcat7
- 如何监控ActiveMQ