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. MYSQL 错误 :Out of resources when opening file './datagather/mx_domain#P#p178.MYD' (Errcode: 24) 解决办法

    出现Out of resources when opening file './xxx.MYD' (Errcode: 24)错误是因为打开的文件数超过了my.cnf的--open-files-limi ...

  2. linux安装python使用的MySQLdb

    安装mysqldb模块需已安装mysql 使用pip安装MySQLdb pip install mysql-python mac os安装mysqldb sudo pip install mysql- ...

  3. (C语言)char类型与int类型相加

    #include <stdio.h> int main(void) { ; ; int c = a + b; a += b; printf("c=%d",c); //p ...

  4. 总结Web应用中基于浏览器的安全漏洞

    ‍‍‍‍‍1.浏览器缓存 每次打开一个网站,网页的内容会缓存到用户的机器中.如果这些内容在其他网页中需要重新加载,浏览器加载的是缓存,而不是再次下载内容.如果一些Web应用商店以及显示用户敏感信息(比 ...

  5. java中的日期格式

    时间日期标识符: yyyy:年 MM:月 dd:日 hh:~12小时制(-) HH:24小时制(-) mm:分 ss:秒 S:毫秒 E:星期几 D:一年中的第几天 F:一月中的第几个星期(会把这个月总 ...

  6. Delphi基本图像处理代码

    //浮雕procedure Emboss(SrcBmp,DestBmp:TBitmap;AzimuthChange:integer);overload;var  i, j, Gray, Azimuth ...

  7. 【转】MFC获取程序目录路径方法

    原文网址:http://yeahyuanqing.blog.163.com/blog/static/118025091201149480818/ MFC获得当前应用程序目录的GetCurrentDir ...

  8. php-Mysql示例1

  9. [学习整理]eclipe/MyEclipse:重要的快捷键

    一.查看大工程代码最重要的几个快捷键 其实有一些,直接在编辑器页面内右键也可查看相应的快捷键(比如F3,F4,Ctrl+O,Ctrl+T),但有些比较好用的快捷键,并不能能直接或方便地在eclipse ...

  10. Unity3D学习笔记——选择Enemy

    一.步骤: 1.创建三个Cube,并将这三个Cube的Cube的Tag设为Enemy 2.导入第一人称视角的资源 3.创建名为Targeting的C#脚本 4.编写Targeting脚本,并将它附到第 ...