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 缓存应用的更多相关文章

  1. 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 ...

  2. 关于lucene的IndexSearcher单实例,对于索引的实时搜索

    Lucene版本:3.0 一般情况下,lucene的IndexSearcher都要写成单实例,因为每次创建IndexSearcher对象的时候,它都需要把索引文件加载进来,如果访问量比较大,而索引也比 ...

  3. Lucene.net(4.8.0) 学习问题记录三: 索引的创建 IndexWriter 和索引速度的优化

    前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...

  4. Lucene系列五:Lucene索引详解(IndexWriter详解、Document详解、索引更新)

    一.IndexWriter详解 问题1:索引创建过程完成什么事? 分词.存储到反向索引中 1. 回顾Lucene架构图: 介绍我们编写的应用程序要完成数据的收集,再将数据以document的形式用lu ...

  5. Lucene 更新、删除、分页操作以及IndexWriter优化

    更新操作如下: 注意:通过lukeall-1.0.0.jar 查看软件,我们可以看到,更新其实是先删除在插入, 前面我们知道索引库中有两部分的内容组成,一个是索引文件,另一个是目录文件, 目前我们更新 ...

  6. lucene中的IndexWriter.setMaxFieldLength()

    lucene中的IndexWriter.setMaxFieldLength() 老版本的Lucene中,IndexWriter的maxFieldLength是指一个索引中的最大的Field个数. 这个 ...

  7. Lucene的分析资料【转】

    Lucene 源码剖析 1 目录 2 Lucene是什么 2.1.1 强大特性 2.1.2 API组成- 2.1.3 Hello World! 2.1.4 Lucene roadmap 3 索引文件结 ...

  8. 【Java】Lucene检索引擎详解

    基于Java的全文索引/检索引擎——Lucene Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能. L ...

  9. lucene 搜索引擎使用案例

    1.使用定时框架Quartz.Net创建索引库,引用类库文件有Common.Logging.dll.Lucene.Net.dll,PanGu.dll,PanGu.HighLight.dll,PanGu ...

随机推荐

  1. 入门6:PHP 语法基础——循环

    一.for循环 for($i=0;$i<10;$i++){ echo "Hello".$i."</br>"; } 二.while循环 $i = ...

  2. 搬瓦工vps搭建vpn

    一.下载centos6一键安装包 wget --no-check-certificate https://raw.githubusercontent.com/teddysun/across/maste ...

  3. Start an installation from GRUB

    Start an installation from GRUB Description This tip will show you how to start an installation for ...

  4. svn修改密码跟账户

    在co的时候直接输入账户跟密码 svn co  ${SVNURL} ./ --username **--password *** 或者删除缓存文件,在Linux上面 删除~/.subversion/a ...

  5. VMware内安装Ubuntu后安装vmtools

    今天处于好奇安装了Ubuntu,可是虚拟机运行的时候发现界面很小,于是百度发现要安装一个工具,看了很多方法,就这个比较实用,和大家分享: 第一步:进入系统后,点击虚拟机上的安装vmware tools ...

  6. 2016022613 - redis连接命令集合

    redis连接命令 1.ping 用途:检查服务器是否正在运行 返回数据pong,表示服务器在运行. 2.quit 用途:关掉当前服务器连接 3.auth password 用途:服务器验证密码 没有 ...

  7. 有关collection中的一些数据结构

    Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collection允许相同的元素 ...

  8. bootstrap的栅格布局不支持IE8该如何解决

    用bootstrap的栅格布局在IE8上出现失效的情况,通常有两种解决方式 方法/步骤   方法一:引用第三方js,一个叫respond.js的东西,github上可以搜到   方法二:由于IE8不支 ...

  9. ASP.NET(C#)常用数据加密和解密方法汇总

    一.            数据加密的概念 1.  基本概念 2.  基本功能 3.  加密形式 二.            数据加密的项目应用和学习 1.  媒体加密:DRM 2.  文件加密:文本 ...

  10. ASP 验证、查询AD域账户信息

    '''函数功能:查询域用户信息 '''参数说明:strAdmin-域管理账户:Password-域帐户密码:Domain-域服务器. ''' ''' 参考资料:http://www.experts-e ...