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

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    package
    org.ostree.module.lucene;

    import
    org.apache.commons.pool.KeyedPoolableObjectFactory;

    import
    org.apache.lucene.index.IndexReader;

    import
    org.apache.lucene.store.FSDirectory;

    import
    org.slf4j.Logger;

    import
    org.slf4j.LoggerFactory;

    import
    java.io.File;

    import
    java.util.NoSuchElementException;

    public
    class IndexReaderFactory implements
    KeyedPoolableObjectFactory<String, IndexReader> {

        private
    String baseIndexDir="/var/data/ostree/index";

        private
    static final Logger logger = LoggerFactory

                .getLogger(IndexReaderFactory.class);

        public
    IndexReaderFactory(String baseIndexDir) {

            this.baseIndexDir = baseIndexDir;

        }

        @Override

        public
    IndexReader makeObject(String key) throws
    Exception {

            logger.info("open index: "
    + key);

            File file=new
    File(baseIndexDir,key);

            if(!file.exists()){

                throw
    new NoSuchElementException(key +" index doesn‘t exist!");

            }

            FSDirectory dir =FSDirectory.open(file);

            return 
    IndexReader.open(dir, true);

        }

        @Override

        public
    void destroyObject(String key, IndexReader reader) throws
    Exception {

            logger.info("destroy index: "
    + key);

            reader.close();

        }

        @Override

        public
    boolean validateObject(String key, IndexReader reader) {

            logger.info("validate index: "
    + key);

            if(reader!=null){

                return
    true;

            }

            return
    false;

        }

        @Override

        public
    void activateObject(String key, IndexReader reader) throws
    Exception {

            logger.debug("activate index: "
    + key);

        }

        @Override

        public
    void passivateObject(String key, IndexReader reader) throws
    Exception {

            logger.debug("passivate index: "
    + key);

        }

    }


  • Usage





    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

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    import
    org.apache.commons.pool.KeyedObjectPool;

    import
    org.apache.commons.pool.impl.GenericKeyedObjectPool;

    import
    org.apache.commons.pool.impl.GenericKeyedObjectPoolFactory;

    import
    org.apache.lucene.document.Document;

    import
    org.apache.lucene.index.IndexReader;

    import
    org.apache.lucene.index.Term;

    import
    org.apache.lucene.search.IndexSearcher;

    import
    org.apache.lucene.search.NGramPhraseQuery;

    import
    org.apache.lucene.search.ScoreDoc;

    import
    org.apache.lucene.search.TopDocs;

    public
    class LuceneSearcherPool {

        public
    static void main(String[] args) {

            GenericKeyedObjectPool.Config config = new
    GenericKeyedObjectPool.Config();

            GenericKeyedObjectPoolFactory<String, IndexReader> poolFactory = new
    GenericKeyedObjectPoolFactory<String, IndexReader>(new
    IndexReaderFactory("/var/data/ostree/index"), config);

            KeyedObjectPool<String, IndexReader> pool = poolFactory.createPool();

            try
    {

                String[] dates = {"2012-01-01", "2011-01-04", "2012-01-05"};

                for
    (String date : dates) {

                    for
    (int i = 0; i < 10; i++) {

                        long
    start = System.currentTimeMillis();

                        IndexReader reader = pool.borrowObject(date);

                        test(reader);

                        pool.returnObject(date, reader);

                        System.out.println(date + ":"
    + i + ";"
    + (System.currentTimeMillis() - start));

                    }

                }

                pool.close();

            } catch
    (Exception ex) {

            }

        }

        public
    static void test(IndexReader reader) throws
    Exception {

            String input = "java";

            int
    num = 5;

            IndexSearcher searcher = new
    IndexSearcher(reader);

            //build your query here

           //Query query =

            TopDocs hits = searcher.search(query, num);

            for
    (ScoreDoc scoreDoc : hits.scoreDocs) {

                Document doc = searcher.doc(scoreDoc.doc);

              // handle the Document

            }

            searcher.close();

        }

    }

Cache Lucene IndexReader with Apache Commons Pool,布布扣,bubuko.com

时间: 2024-10-07 22:18:39

Cache Lucene IndexReader with Apache Commons Pool的相关文章

apache commons pool

apache commons下的pool 其中的borrowObject函数源代码显示其产生可用对象的过程: 如果stack中有空闲的对象,则pop对象,激活对象(activate函数),验证对象(validate函数).最终将合格的对象返回给client. 若对象在这个流程中出错,则在从stack中取出一个,并执行相同的流程.如此循环,直到stack为空. 如果stack为空,则直接调用makeObject函数创建一个对象.在返回对象之前,还会调用验证函数(validate)验证是否有效. 转

Apache Commons pool 简介和pool连接池代码

在实际中工作,我们经常遇到需要连接池的地方,特别是数据库连接池. 我们为什么需要池呢?因为这些资源的创建,都很消耗资源.因此,我们使用一个对象池,里面预先创建了一些资源对象.当我们需要时,从池中取出对象,而不需要时,把对象返回池中.这样就可以提高代码运行的效率. Apache Commons Pool(http://commons.apache.org/pool/)为我们提供了很方便的接口来实现对象池.我们唯一需要实现的就是如何产生对象,而不用去考虑一堆多线程问题. 2013年,Apache C

The type org.apache.commons.pool.impl.GenericObjectPool$Config cannot be resolved. It is indirectly

static { try { JedisPoolConfig config = new JedisPoolConfig(); config.setMaxActive(MAX_ACTIVE); config.setMaxIdle(MAX_IDLE); config.setMaxWait(MAX_WAIT); config.setTestOnBorrow(TEST_ON_BORROW); jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT, A

【Tomcat】【3】报错 Illegal access: this web application instance has been stopped already. Could not load [org.apache.commons.pool.impl.CursorableLinkedList$Cursor]

用Tomcat运行项目报错: Illegal access: this web application instance has been stopped already. Could not load [org.apache.commons.pool.impl.CursorableLinkedList$Cursor]. The following stack trace is thrown for debugging purposes as well as to attempt to term

Apache Commons 工具类介绍及简单使用

Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍.   组件 功能介绍 BeanUtils 提供了对于JavaBean进行各种操作,克隆对象,属性等等. Betwixt XML与Java对象之间相互转换. Codec 处理常用的编码方法的工具类包 例如DES.SHA1.MD5.Base64等. Collections java集合框架操作. Compress java提供文件打包 压缩类库. C

Apache Commons 工具集介绍

Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. 组件 功能介绍 BeanUtils 提供了对于JavaBean进行各种操作,克隆对象,属性等等. Betwixt XML与Java对象之间相互转换. Codec 处理常用的编码方法的工具类包 例如DES.SHA1.MD5.Base64等. Collections java集合框架操作. Compress java提供文件打包 压缩类库. Con

Apache Commons Pool2 源码分析 | Apache Commons Pool2 Source Code Analysis

Apache Commons Pool实现了对象池的功能.定义了对象的生成.销毁.激活.钝化等操作及其状态转换,并提供几个默认的对象池实现.在讲述其实现原理前,先提一下其中有几个重要的对象: PooledObject(池对象). PooledObjectFactory(池对象工厂). Object Pool(对象池). 下面分别详细讲解它们的实现. PooledObject(池对象) 用于封装对象(如:线程.数据库连接.TCP连接),将其包裹成可被池管理的对象.提供了两个默认的池对象实现: De

Apache Commons工具集简介

Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. 组件 功能介绍 BeanUtils 提供了对于JavaBean进行各种操作,克隆对象,属性等等. Betwixt XML与Java对象之间相互转换. Codec 处理常用的编码方法的工具类包 例如DES.SHA1.MD5.Base64等. Collections java集合框架操作. Compress java提供文件打包 压缩类库. Con

Apache Commons Pool2连接池代码

2013年,Apache Commons Pool 2.0 发布,这是一个完全重写的对象池的实现.实现的代码和原来差异很大,原来的一些例子就不能用了.按照上面的例子,用pool2的类和方法重写下. ApacheCommons Pool 2.0 代码如下: package test.ffm83.commons.pool; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.lang.