IndexSearcher

来源:互联网 发布:mac pro 13.3屏幕尺寸 编辑:程序博客网 时间:2024/05/17 12:23

一、关于lucene的IndexSearcher单市里,对于索引的实时搜索

Lucene版本:3.0

一般情况下,lucene的IndexSearcher都要写成单实例,因为每次创建IndexSearcher对象的时候,它都需要把索引文件加载进来,如果访问量比较大,而索引也比较大,那就很容易造成内存溢出!

但是如果仅仅按照一般的单实例来写的话,如果更新了索引,那么在不重启服务的情况下,Searcher对象是搜索不到索引更新后的内容的.如何解决呢,这里给出一个方法!

在这个方法里,建造了一个Factory类,分别管理IndexReader和IndexSearcher的单实例.

import java.io.File;  

 import java.io.IOException; 

  import java.util.Date; 

  import org.apache.lucene.index.CorruptIndexException;  

 import org.apache.lucene.index.IndexReader;  

 import org.apache.lucene.search.IndexSearcher;  

 import org.apache.lucene.store.SimpleFSDirectory;   

/**   * 工厂类,负责管理IndexReader、IndexSearcher  

 * @author .K'   */  

 public class LuceneFactory { 

    private static IndexReader reader = null; 

    private static IndexSearcher searcher = null;   /**   *获得IndexReader对象,判断是否为最新,不是则重新打开 (以下省略了try...catch)   *@param  file    索引路径的File对象   *@return   IndexReader对象   **/   

    public static synchronized IndexReader getIndexReader(File file){  

         if (reader == null) {   

            reader = IndexReader.open(SimpleFSDirectory.open(file));   

        } else {   

            if(!reader.isCurrent()){   

               reader = reader.reopen();  

             }   

         }  

         return reader;   

    }  

  /**   * 获得IndexSearcher对象,判断当前的Searcher中reader是否为最新,如果不是,则重新创建IndexSearcher(省略了try...catch)  

  * @param reader   

 *  IndexReader对象   

 * @return IndexSearcher对象   */   

  public static synchronized IndexSearcher getIndexSearcher(IndexReader reader) {  

   if (searcher == null) {   

            searcher = new IndexSearcher(reader);   

   }else{   

             IndexReader r = searcher.getIndexReader(); 

             if(!r.isCurrent()){  

                 searcher = new IndexSearcher(reader);  

              }  

    }   

 return searcher;  

 }

   }

 调用工厂类中的方法创建Searcher

IndexReader reader = LuceneFactory.getIndexReader(new File(path));
 
Searcher searcher = LuceneFactory.getIndexSearcher(reader);

以上就可以解决对于索引无法实时搜索的问题了!


使用IndexReader.repen提高搜索速度

1,使用indexreader创建indexsearcher. 

2,indexsearcher在使用完了以后不要关闭. 

3.使用indexreader.isCurrent()判断索引是否被indexwriter改动. 

4,如果索引被改动,indexsearcher.close()先前那个,然后new indexsearcher(indexreader).

传string给searcher,searcher会维护一个内部的reader,当本次搜索结束后reader会被关掉.如果使用reader构造,reader在本次搜索结束后不会被关掉,除非你自己调用reader.close();所以用reader去构造searcher,然后通过searcher.getIndexReader()获取当前的reader,用reader.iscurrent()判断索引文件是否变化了,如果索引文件已经更改,则把当前的searcher关闭,然后再利用reader.reopen()方法获取新的reader,再创建一个searcher,像这样,new IndexSearcher(reader.reopen());

代码:

 一、indexSearcher=new IndexSearcher(IndexReader.open(indexPath));

二、/*     * 先获取reader,如果索引文件已经变化,关闭当前indexSearcher,然后以重新获取的indexReader     * 作为参数new一个新的indexSearcher实例     */     

IndexReader indexReader=indexSearcher.getIndexReader();//获取当前的indexReader    

if(!indexReader.isCurrent()){//判断是否有索引更新             

     // 如果有索引更新,先关闭当前的indexSearcher     

    indexSearcher.close();      //利用indexReader.reopen()获取新的indexReader,并作为IndexSearcher的参数创建一个新的indexSearcher     indexSearcher=new IndexSearcher(indexReader.reopen());    

 }

0 0
原创粉丝点击