Lucene IndexReader,IndexWriter,IndexSearcher 缓存应用

标签: lucene indexreader indexwriter | 发表时间:2013-09-02 07:37 | 作者:lilinhai548
出处:http://blog.csdn.net

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回收最大生命周期

     */

    privatestaticfinalint oldReaderMaxLifeTime = 60 * 1000;

   

    privatestaticfinal Timer readerRefereshTimer = new Timer();

   

    privatestaticfinal Map<Directory, DirectoryReader> readerMap = newHashMap<Directory, DirectoryReader>();

   

    privatestaticfinal ReaderManager manager = new ReaderManager();

   

    publicstaticfinalsynchronized ReaderManager getInstance()

    {

       return manager;

    }

   

    /**

     *创建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)

    {

       return readerMap.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);

    }

}

 

 

作者:lilinhai548 发表于2013-9-1 23:37:13 原文链接
阅读:156 评论:0 查看评论

相关 [lucene indexreader indexwriter] 推荐:

Lucene IndexReader,IndexWriter,IndexSearcher 缓存应用

- - CSDN博客架构设计推荐文章
1.IndexManager类,用于提供IndexReader,IndexWriter,IndexSearcher获取接口.      *所有writer公共配置.            //根据Directory对象,初始化indexReader对象.            //初始化writer对象.

Lucene 4.x 之 IndexReader

- - zzm
在Lucene 3.x时代,《Lucene In Action》是一本相当不错的参考书,书中详细介绍了Lucene各种高级使用技术,对于开发者来说非常实用. 但是近期Lucene升级到了4.x版本,在性能等各方面有了很大的提高,值得在新项目中使用. 然而Lucene 4.x中的API相比3.x来说有了很大的改变,《Lucene In Action》中的很多内容都已经过时了,并且由于4.x推出的时间不长,还没有比较好的文档来对用法进行说明,这个系列文章就是想记录下自己使用Lucene 4.x的经验体会,供大家参考使用.

lucene排序

- - 开源软件 - ITeye博客
排序是对于全文检索来言是一个必不可少的功能,在实际运用中,排序功能能在某些时候给我们带来很大的方便,比如在淘宝,京东等一些电商网站我们可能通过排序来快速找到价格最便宜的商品,或者通过排序来找到评论数最高或卖的最好的商品,再比如在Iteye里的博客栏里,每天都会以降序的方式,来显示出最新发出的几篇博客,有了排序,我们就能在某些时候很方便快速的得到某些有效信息,所以说排序功能,无处不在 ^_^.

[原]Lucene系列-facet

- - 文武天下
facet:面、切面、方面. 个人理解就是维度,在满足query的前提下,观察结果在各维度上的分布(一个维度下各子类的数目). 如jd上搜“手机”,得到4009个商品. 其中品牌、网络、价格就是商品的维度(facet),点击某个品牌或者网络,获取更细分的结果. 点击品牌小米,获得小米手机的结果,显示27个.

[原]Lucene系列-FieldCache

- - 文武天下
域缓存,加载所有文档中某个特定域的值到内存,便于随机存取该域值. 当用户需要访问各文档中某个域的值时,IndexSearcher.doc(docId)获得Document的所有域值,但访问速度比较慢,而且只能获得Stored域的值. FieldCache能获得域值数组,根据docId random access域值.

Lucene 使用教程

- - 行业应用 - ITeye博客
1 lucene简介 . 1.1 什么是lucene . Lucene是一个全文搜索框架,而不是应用产品. 因此它并不像 http://www.baidu.com/ 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品. 1.2 lucene能做什么 . 要回答这个问题,先要了解lucene的本质.

文章: 集成Lucene和HBase

- - InfoQ cn
在所有先进的应用程序中,不管是购物站点还是社交网络乃至风景名胜站点,搜索都扮演着关键的角色. Lucene搜索程序库事实上已经成为实现搜索引擎的标准. 苹果、IBM、Attlassian(Jira)、Wolfram以及很多大家喜欢的公司【1】都使用了这种技术. 因此,大家对任何能够提升Lucene的可伸缩性和性能的实现都很感兴趣.

Solr\Lucene优劣势分析

- - 淘宝网综合业务平台团队博客
最早lucene2.4以及以前,追溯到2008年前后,lucene刚刚引起大家的关注,到后来Nutch. 、solr的出现,lucene变得更加热. Nutch、Solr的发展,极大推动了lucene的升级. 对于一些接触过搜索,使用过lucene、solr的人来说,一般都会感觉lucene、solr很牛逼.