Lucene IndexReader,IndexWriter,IndexSearcher 缓存应用
1.IndexManager类,用于提供IndexReader,IndexWriter,IndexSearcher获取接口
import java.io.File;
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
publicclass IndexManager{
/**
*所有writer公共配置
*/
privatestaticfinal IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_44, newStandardAnalyzer(Version.LUCENE_44));
static {
iwc.setOpenMode(OpenMode.CREATE_OR_APPEND);
iwc.setRAMBufferSizeMB(20.0);
iwc.setMaxBufferedDocs(10000);
}
private Directory dir;
private IndexReader reader;
private IndexSearcher searcher;
private IndexWriter writer;
/**
*构造函数
*@paramindexPath
*/
public IndexManager(String indexPath) {
init(new File(indexPath));
}
/**
*构造函数
*@paramindexPath
*/
public IndexManager(File dirFile) {
init(dirFile);
}
privatevoid init(File dirFile) {
try {
dir = FSDirectory.open(dirFile);
//根据Directory对象,初始化indexReader对象
ReaderManager.getInstance().createIndexReader(dir);
//初始化writer对象
writer = new IndexWriter(dir, iwc);
} catch (IOException e) {
e.printStackTrace();
}
}
public IndexSearcher getSearcher() {
IndexReader ir = ReaderManager.getInstance().getIndexReader(dir);
if(reader == null || reader != ir)
{
reader = ir;
searcher = new IndexSearcher(reader);
}
returnsearcher;
}
public IndexWriter getWriter() {
returnwriter;
}
publicvoid commitWriter()
{
try {
writer.commit();
} catch (IOException e) {
rollback();
}
}
privatevoid rollback() {
try {
writer.rollback();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
2.ReaderManager类,用于提供IndexReader生命周期管理
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Map.Entry;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.store.Directory;
/**
*IndexReader生命周期,以及改变后reopen管理类
*@authoradmin
*
*/
publicclass ReaderManager {
/**
*reader回收Map
*/
privatestaticfinal Map<DirectoryReader, Long> recyleReaderMap = new HashMap<DirectoryReader, Long>();
/**
*oldreader回收最大生命周期
*/
privatestaticfinalintoldReaderMaxLifeTime = 60 * 1000;
privatestaticfinal Timer readerRefereshTimer = new Timer();
privatestaticfinal Map<Directory, DirectoryReader> readerMap = newHashMap<Directory, DirectoryReader>();
privatestaticfinal ReaderManager manager = new ReaderManager();
publicstaticfinalsynchronized ReaderManager getInstance()
{
returnmanager;
}
/**
*创建indexReader并放缓存
*@paramreader
*/
publicsynchronizedvoid createIndexReader(Directory dir)
{
try {
readerMap.put(dir, DirectoryReader.open(dir));
} catch (IOException e) {
e.printStackTrace();
}
}
/**
*获取IndexReader
*@paramdir
*@return
*/
public IndexReader getIndexReader(Directory dir)
{
returnreaderMap.get(dir);
}
static
{
readerRefereshTimer.schedule(new TimerTask(){
publicvoid run() {
//判断处理reader是否改变
for (Entry<Directory, DirectoryReader> entry : newHashMap<Directory, DirectoryReader>(readerMap).entrySet()) {
try {
DirectoryReader oldReader = entry.getValue();
DirectoryReader newReader = DirectoryReader.openIfChanged(oldReader);
if(newReader != null)
{
//替换旧reader对象
readerMap.put(entry.getKey(), newReader);
//放入回收MAP中
recyleReaderMap.put(oldReader, System.currentTimeMillis());
}
} catch (IOException e) {
e.printStackTrace();
}
}
//处理old reader回收
for (Entry<DirectoryReader, Long> entry : newHashMap<DirectoryReader, Long>(recyleReaderMap).entrySet()) {
if(System.currentTimeMillis() - entry.getValue()> oldReaderMaxLifeTime)
{
try {
entry.getKey().close();
} catch (IOException e) {
e.printStackTrace();
} finally {
recyleReaderMap.remove(entry.getKey());
}
}
}
}
}, 5 * 1000, 5 * 1000);
}
}
Lucene IndexReader,IndexWriter,IndexSearcher 缓存应用的更多相关文章
- Cache Lucene IndexReader with Apache Commons Pool
IndexReaderFactory.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 2 ...
- 关于lucene的IndexSearcher单实例,对于索引的实时搜索
Lucene版本:3.0 一般情况下,lucene的IndexSearcher都要写成单实例,因为每次创建IndexSearcher对象的时候,它都需要把索引文件加载进来,如果访问量比较大,而索引也比 ...
- Lucene.net(4.8.0) 学习问题记录三: 索引的创建 IndexWriter 和索引速度的优化
前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...
- Lucene系列五:Lucene索引详解(IndexWriter详解、Document详解、索引更新)
一.IndexWriter详解 问题1:索引创建过程完成什么事? 分词.存储到反向索引中 1. 回顾Lucene架构图: 介绍我们编写的应用程序要完成数据的收集,再将数据以document的形式用lu ...
- Lucene 更新、删除、分页操作以及IndexWriter优化
更新操作如下: 注意:通过lukeall-1.0.0.jar 查看软件,我们可以看到,更新其实是先删除在插入, 前面我们知道索引库中有两部分的内容组成,一个是索引文件,另一个是目录文件, 目前我们更新 ...
- lucene中的IndexWriter.setMaxFieldLength()
lucene中的IndexWriter.setMaxFieldLength() 老版本的Lucene中,IndexWriter的maxFieldLength是指一个索引中的最大的Field个数. 这个 ...
- Lucene的分析资料【转】
Lucene 源码剖析 1 目录 2 Lucene是什么 2.1.1 强大特性 2.1.2 API组成- 2.1.3 Hello World! 2.1.4 Lucene roadmap 3 索引文件结 ...
- 【Java】Lucene检索引擎详解
基于Java的全文索引/检索引擎——Lucene Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能. L ...
- lucene 搜索引擎使用案例
1.使用定时框架Quartz.Net创建索引库,引用类库文件有Common.Logging.dll.Lucene.Net.dll,PanGu.dll,PanGu.HighLight.dll,PanGu ...
随机推荐
- 在CAD中怎么画圆形视口的详细说明
方法如下:在布局下画一个合适的圆,然后:命令: _-vports指定视口的角点或[开(ON)/关(OFF)/布满(F)/消隐出图(H)/锁定(L)/对象(O)/多边形(P)/恢复(R)/2/3/4]& ...
- ecshop 报错
ECShop出现Strict Standards: Only variables should be passed b (2014-06-04 17:00:37) 转载▼ 标签: ecshop 报错 ...
- C# Winform开发框架模块图(平台核心模块+示例模块)
企业版V4.0 - 模块图 企业版V4.0 - 项目解决方案 Client/Server构架,有两个解决方案: 客户端解决方案说明: 服务端解决方案说明: C/S系统开发框架- ...
- 配有Tesla K40c的服务器新装Ubuntu16.04并安装CUDA8.0、Anaconda3、Matlab2016a、OPENCV3.1、CuDNN5.1、MXNet
注:本文原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/) 决定加入深度学习的大军,感谢导师给配了台新设备!第一次接触服务器并配置开发环境,整个过程中 ...
- nutch 1.7 修改代码后如何编译发布,并集群采集攻略
nutch 1.3之后,分布式的可执行文件与单机可执行文件进行了分离 接上篇,nutch 1.7 导入 eclipse 本篇所要解决的问题:nutch下载下来经过简单的配置即可进行采集,但有时候我们需 ...
- [BZOJ 1045] [HAOI2008] 糖果传递
题目链接:BZOJ 1045 Attention:数据范围中 n <= 10^5 ,实际数据范围比这要大,将数组开到 10^6 就没有问题了. 我们先来看一下下面的这个问题. 若 n 个人坐成一 ...
- PHP 7.0 安装使用与性能监测!
PHP 7.0发布,网上关于新版的介绍很多,介于 7.0 在正式发布之前已经发过若干个 Beta.8个 RC,应该不会出现重大问题.今日我将一台机器升级至 PHP 7.0 并将有关信息记录如下. 本人 ...
- ios开发UI篇—在ImageView中添加按钮以及Tag的参数说明
ios开发UI篇—在ImageView中添加按钮以及Tag的参数说明 一.tag参数 一个视图通常都只有一个父视图,多个子视图,在开发中可以通过使用子视图的tag来取出对应的子视图.方法为Viewwi ...
- 编译direct show 的filter项目
最近搞windows编程,想学习一下direct show.编译了一下sdk里面的一个sample filter,做个笔记,记录一下. 说来渐愧,vc也用了n久了,还没有自己动手建立一个正式的项目,都 ...
- 在keil中使用Astyle格式化你的代码的方法
一个好的程序,不仅要有好的算法,同时也需要有良好的书写风格.写出好的算法不容易,但是好的代码风格却并不困难.提到格式化代码,Astyle是一个不能错过的工具,它可以方便的将程序代码格式化成自己想要的样 ...