您的位置:首页 > 其它

7、学习Lucene3.5之IndexReader和IndexWriter注意事项

2018-02-06 20:52 411 查看
(1)IndexReader

    一般全局唯一,无需关闭。在搜索索引时,创建IndexSearcher对象即可,关闭IndexSearcher即可

/**
* 创建创建读索引工具:IndexReader
* 问题:若IndexReader全局唯一,则当我们在搜索索引的过程中,索引发生改变(比如:用IndexWriter删除某个索引),但是搜
*       索到的索引并没有改变?
* 原因:因为IndexReader全局唯一,它始终读取的是最开始创建的索引。
* 解决办法:
*     使用IndexReader.openIfChanged(IndexReader oldReader)方法,来读取最新的索引
*     IndexReader.openIfChanged():若IndexReader打开后,索引发生了变化,则返回一个新的IndexReader,否则返回null
*/
/**
* 创建IndexSearcher对象
*/
public IndexSearcher createIndexSearcher(){
try {
if (indexReader == null){
indexReader = IndexReader.open(directory);
} else {
/**
* IndexReader.openIfChanged(IndexReader oldReader)方法解析:
*     若IndexReader打开后,索引发生了变化,则返回一个新的IndexReader,否则返回null
*/
IndexReader ir = IndexReader.openIfChanged(indexReader);
if (ir != null){
//将原来的indexReader关闭
indexReader.close();
indexReader = ir;
}
}
} catch (IOException e) {
e.printStackTrace();
}
return new IndexSearcher(indexReader);
}


(2)IndexWriter

/**
* 创建创建写索引工具:IndexWriter
* 注意:若IndexWriter也是全局唯一(单例模式),则在使用IndexWriter时无需关闭
* 问题:若IndexWriter使用完毕之后不关闭,那么会导致新建的索引没有生效?
* 解决办法:使用indexWriter.commit()方法提交对索引的更改!
*/
public IndexWriter createIndexWriter(){
IndexWriter indexWriter = null;
try {
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35));
//设置创建索引的策略为:每次都重新创建索引:IndexWriterConfig.OpenMode.CREATE
//            indexWriterConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
//创建写索引工具
indexWriter = new IndexWriter(directory,indexWriterConfig);

} catch (IOException e) {
e.printStackTrace();
}
return  indexWriter;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: