zoukankan      html  css  js  c++  java
  • 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);

        }

    }

     

  • 相关阅读:
    CString详细讲解
    常用的函数调用约定 stdcall/cdecl/fastcall
    near指针,far指针,huge指针
    md /mdd /ml /mt/mtd
    VC通过ADO链接ORACLE数据库
    c++ 线程同步
    typedef struct与struct的区别
    BeginPaint&&GetDc(转)
    left join 命令详解
    sqlserver IO 监测
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3297109.html
Copyright © 2011-2022 走看看