Lucene学习笔记之十一:IndexReader设计成单例

2019-03-10 19:02|来源: 领悟书生

定义一个静态的IndexReader成员变量reader,然后在构造方法中初始化

public class IndexUtil {

   private static IndexReader reader = null;//一般都是单例的

   public IndexUtil() {

      try {

          reader = IndexReader.open(directory);

      } catch (IOException e) {

          e.printStackTrace();

      }

   }

}

获取的时候,用IndexReader.openIfChanged方法判断reader的状态是否变化,如果有变化,就把之前的关闭,重新打开一个

public void search02() {

   try {

      IndexSearcher searcher = getSearcher();

      TermQuery query = new TermQuery(new Term("content","like"));

      TopDocs tds = searcher.search(query,  10);

      for(ScoreDoc sd:tds.scoreDocs) {

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

          System.out.println(doc.get("id")

}

      searcher.close();

   } catch (CorruptIndexException e) {

      e.printStackTrace();

   } catch (IOException e) {

      e.printStackTrace();

   }

}

public IndexSearcher getSearcher() {

   try {

      if(reader==null) {

          reader = IndexReader.open(directory);

      } else {

          IndexReader tr = IndexReader.openIfChanged(reader);

          if(tr!=null) {

             reader.close();

             reader = tr;

          }

      }

      return new IndexSearcher(reader);

   } catch (CorruptIndexException e) {

      e.printStackTrace();

   } catch (IOException e) {

      e.printStackTrace();

   }

   return null;

}


本文链接:Lucene学习笔记之十一:IndexReader设计成单例,领悟书生学习笔记,转载请注明出处:http://www.656463.com/article/448

相关问答

更多
  • lucene怎么用[2022-07-03]

    Lucene是一个全文检索系统框架,开源的。 用起来比较方便,去Lucene的官网上下一个包并导入到你的工程中就可以调用包里面的类了。 一般的书里面介绍的版本都是1.4.3或者稍微高级一点的,不过现在lucene3.0正式发布,一些函数调用方法已经改变了,你可以下载一个版本低一点的Lucene比较适合学习~ 当然你直接从3.0入手的话网上资料也是非常丰富的~
  • 单例模式(Singleton Pattern)是一个比较简单的模式。 定义: 确保某一个类只有一个实例,而且自动实例化并向整个系统提供这个实例。 通用类图: 通用代码: Singleton类称为单例类,通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行实例化的。 /** * 线程安全的单例模式 * 饿汉式单例 * @author Administrator * */ public class Singleton { private static final Singleton si ...
  • 基于Java的全文检索引擎. 参考资料: Apache: Lucene Project http://jakarta.apache.org/lucene/ Lucene开发/用户邮件列表归档 Lucene-dev@jakarta.apache.org Lucene-user@jakarta.apache.org The Lucene search engine: Powerful, flexible, and free http://www.javaworld.com/javaworld/jw-09-200 ...
  • 很多人会抱怨 Lucene 在数据量增加到一定规模的时候,性能会出现明显下降,对于并发用户访问的支持能力也比较弱。其实在工程师所遇到的绝大多数环境下 Lucene 的性能问题,往往是因为系统没有经过良好的调优。而非简单的 Lucene 设计缺陷所造成。 当前使用 Lucene 的知名网站包括,Stack Exchange,旗下全球最大的事实性问答网站 StackOverFlow.com . 基于Lucene 文档 逗How to make indexing faster地,我们可以看到如下经验可能可以应用于 ...
  • 看看NRTManager和SearcherManager。 你真的不必自己处理这个问题。 Look at NRTManager and SearcherManager. You really don't have to handle this yourself.
  • IndexSearcher是一个围绕IndexReader的轻量级包装器。 即使您使用IndexSearcher构造函数, IndexReader也会在引擎盖下打开 ,因此您可以从两个片段中获得相同的性能。 尽管它很方便,但通过目录直接打开IndexSearcher是一种不好的做法。 此外,自Lucene 3.5以来,这个构造函数已被弃用。 IndexSearcher is a lightweight wrapper around an IndexReader. Even if you use the In ...
  • 听起来你已经掌握了如何获得TermsEnum,所以从那里,只需使用seekCeil寻找你想要匹配的前缀,然后遍历TermsEnum,直到找到一个与前缀不匹配的前缀。 例如: Terms terms = MultiFields.getTerms(indexReader, "text"); TermsEnum termsEnum = terms.iterator(); List matchingTerms = new ArrayList(); termsEnum.seekCeil(new ...
  • 首先,您必须获取IndexReader的文档并迭代它们按标签搜索,然后使用每个标签的值进行搜索。 First you have to get IndexReader's documents and iterate them searching by label and then search using the value of every label.
  • 这是适用于Lucene 6.4的代码。 它在所有字段中找到最常用的术语,用于分别在字段中查找最常用的术语调整代码。 IndexReader reader = DirectoryReader.open(dir); final Fields fields = MultiFields.getFields(reader); final Iterator iterator = fields.iterator(); long maxFre ...
  • 根据当前用于Lucene 6.4.2的IndexReader JavaDoc ,您应该使用DirectoryReader.open 。 According to current IndexReader JavaDoc for Lucene 6.4.2 you should use DirectoryReader.open.