IndexSearcher
来源:互联网 发布:mac pro 13.3屏幕尺寸 编辑:程序博客网 时间:2024/05/17 12:23
一、关于lucene的IndexSearcher单市里,对于索引的实时搜索
Lucene版本:3.0
一般情况下,lucene的IndexSearcher都要写成单实例,因为每次创建IndexSearcher对象的时候,它都需要把索引文件加载进来,如果访问量比较大,而索引也比较大,那就很容易造成内存溢出!
但是如果仅仅按照一般的单实例来写的话,如果更新了索引,那么在不重启服务的情况下,Searcher对象是搜索不到索引更新后的内容的.如何解决呢,这里给出一个方法!
在这个方法里,建造了一个Factory类,分别管理IndexReader和IndexSearcher的单实例.
import java.io.File;
import java.io.IOException;
import java.util.Date;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.store.SimpleFSDirectory;
/** * 工厂类,负责管理IndexReader、IndexSearcher
* @author .K' */
public class LuceneFactory {
private static IndexReader reader = null;
private static IndexSearcher searcher = null; /** *获得IndexReader对象,判断是否为最新,不是则重新打开 (以下省略了try...catch) *@param file 索引路径的File对象 *@return IndexReader对象 **/
public static synchronized IndexReader getIndexReader(File file){
if (reader == null) {
reader = IndexReader.open(SimpleFSDirectory.open(file));
} else {
if(!reader.isCurrent()){
reader = reader.reopen();
}
}
return reader;
}
/** * 获得IndexSearcher对象,判断当前的Searcher中reader是否为最新,如果不是,则重新创建IndexSearcher(省略了try...catch)
* @param reader
* IndexReader对象
* @return IndexSearcher对象 */
public static synchronized IndexSearcher getIndexSearcher(IndexReader reader) {
if (searcher == null) {
searcher = new IndexSearcher(reader);
}else{
IndexReader r = searcher.getIndexReader();
if(!r.isCurrent()){
searcher = new IndexSearcher(reader);
}
}
return searcher;
}
}
调用工厂类中的方法创建Searcher
IndexReader reader = LuceneFactory.getIndexReader(
new
File(path));
Searcher searcher = LuceneFactory.getIndexSearcher(reader);
以上就可以解决对于索引无法实时搜索的问题了!
使用IndexReader.repen提高搜索速度
1,使用indexreader创建indexsearcher.
2,indexsearcher在使用完了以后不要关闭.
3.使用indexreader.isCurrent()判断索引是否被indexwriter改动.
4,如果索引被改动,indexsearcher.close()先前那个,然后new indexsearcher(indexreader).
传string给searcher,searcher会维护一个内部的reader,当本次搜索结束后reader会被关掉.如果使用reader构造,reader在本次搜索结束后不会被关掉,除非你自己调用reader.close();所以用reader去构造searcher,然后通过searcher.getIndexReader()获取当前的reader,用reader.iscurrent()判断索引文件是否变化了,如果索引文件已经更改,则把当前的searcher关闭,然后再利用reader.reopen()方法获取新的reader,再创建一个searcher,像这样,new IndexSearcher(reader.reopen());
代码:
一、indexSearcher=new IndexSearcher(IndexReader.open(indexPath));
二、/* * 先获取reader,如果索引文件已经变化,关闭当前indexSearcher,然后以重新获取的indexReader * 作为参数new一个新的indexSearcher实例 */
IndexReader indexReader=indexSearcher.getIndexReader();//获取当前的indexReader
if(!indexReader.isCurrent()){//判断是否有索引更新
// 如果有索引更新,先关闭当前的indexSearcher
indexSearcher.close(); //利用indexReader.reopen()获取新的indexReader,并作为IndexSearcher的参数创建一个新的indexSearcher indexSearcher=new IndexSearcher(indexReader.reopen());
}
- IndexSearcher
- IndexSearcher排序
- 关于IndexSearcher检索器
- 关于IndexSearcher检索器
- IndexSearcher的基础
- lucene-使用QueryParser和IndexSearcher
- Lucene中IndexSearcher类的初始化
- clucene创建IndexSearcher时失败的原因
- 关于lucene的IndexSearcher是否单实例
- Lucene IndexReader,IndexWriter,IndexSearcher 缓存应用
- IndexSearcher的基础使用及注意事项
- 简单封装Lucenene的IndexWriter、IndexSearcher对象
- Lucene 4.7 教程起步--搜索IndexSearcher
- Lucene.net多字段(Fields)、多索引目录(IndexSearcher)搜索
- Lucene(2.4)的检索工具类-IndexSearcher解读
- lucene使用教程4 --常用类的对象之IndexSearcher
- 基于lucene的案例开发:IndexSearcher中检索方法
- 一步一步跟我学习lucene(7)---lucene搜索之IndexSearcher构建过程
- 黑马程序员-ASP.NET图片验证码代码
- .net mvc 微信开发笔记(二)------网址接入
- JBOSS 7.1监听所有IP
- input file 问题集
- ORA-65096: invalid common user or role name
- IndexSearcher
- java排序算法
- Linux处理7z文件(压缩)的工具
- 线段树(单点更新) 之 hdu 1754
- Hibernate中session.connection()的替代方法
- hdu 2115 I Love This Game
- android 修改xml实现横屏与竖屏
- linux inittab详解
- hdoj 1097 A hard puzzle