`

Lucene优化

 
阅读更多

转自:http://blog.csdn.net/wen158809179/article/details/7419254

 

1. 让程序中只有一个 IndexWriter。因为 IndexWriter 是对索引库目录下的文件进行操作,就算在多线程情况下,每次也只会有一个线程在访问这个文件。

   因此,程序中没必要维持多个 IndexWriter。

[java] view plaincopy
  1. /** 
  2.  * 使用 IndexWriter 进行保存或更新操作时, 
  3.  * 若不手动调用 IndexWriter 的 close 方法,数据并不会持久化到索引库中。 
  4.  * IndexWriter 一般只需要在程序退出的时候再关闭。 
  5.  * 因此,需要调用它的 commit 方法手动提交。需要特别注意。 
  6.  */  
  7. public class LuceneUtils {  
  8.        private static IndexWriter indexWriter;  
  9.        static {  
  10.               try {  
  11.                      /* 最好将目录放在配置文件 */  
  12.                      Directory directory = FSDirectory.open(new File("./indexDir/"));  
  13.                      /* 最好将版本放在配置文件 */  
  14.                      Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);  
  15.                      indexWriter = new IndexWriter(directory, analyzer, MaxFieldLength.LIMITED);  
  16.               } catch (Exception e) {  
  17.                      throw new RuntimeException(e);  
  18.               }  
  19.        }  
  20.        /** 
  21.         *  获取 IndexWriter 
  22.         */  
  23.        public static IndexWriter getIndexWriter() {  
  24.               return indexWriter;  
  25.        }  
  26.           /** 
  27.         * 关闭 IndexWriter 
  28.         */  
  29.        public static void closeIndexWriter() {  
  30.               try {  
  31.                      indexWriter.close();  
  32.               } catch (Exception e) {  
  33.                      throw new RuntimeException(e);  
  34.               }  
  35.        }  
  36. }  
  37.    

 2. 文件优化

  Lucene 会为每一次addDocument(document) 是在索引库目录下新增一个文件".cfs"后缀的文件。

   这意味我们的程序将便对越来越多的文件(但是默认情况下,最多也不会超过10个,当文件达到10个的时候,lucene 会将它们合并为一个大的文件)。意味着 IO 流的打开和关闭也将越来越多。这对效率的影响是比较大的。

   方式是调用 IndexWriter 的 IndexWriter.optimize() 或 indexWriter.setMergeFactor(int)

  IndexWriter.optimize() 被调用后,lucene 会立即将索引库目录下所有 ".cfs" 后缀的文件合并为一个大的文件。但是它的数据是不会改变的。

  indexWriter.setMergeFactor(int) 接收一个整型参数表示当 ".cfs" 文件达到多少数量时就自动合并。

 

3. 结合使用 FSDirectory 和 RAMDirectory

       /*文件系统的索引库,指向物理介质上真实存在的文件 */

       Directorydirectory = FSDirectory.open(new File("./indexDir/"));

       /*内存索引库,是在内存中模拟的一个索引库 */

       DirectoryRAMdir = new RAMDirectory();

   优缺点:

     FSDirectory 速度相对慢,但是 FSDirectory 的优点是能够在磁盘上持久化数据。

     RAMDirectory 读写数据的速度明显要快,但是缺点是数据在程序退出时就没有了。而且受限制于内存的大小。

   双剑合璧:

      1. 在程序启动的时候,将磁盘上的索引库加载到内存中来。

      2. 在程序退出的时候(或指定一个时机),将内存中的索引库数据状态同步会磁盘上。

    

      怎样将磁盘上的索引库加载到内存中来?

              Directory fsDir = FSDirectory.open(newFile("./indexDir/"));

              //使用带参构造器创建 RAMDirectory 对象。下面代码参数为指向磁盘索引库的 FSDirectory 对象 

              Directory RAMdir = newRAMDirectory(directory);

 

      怎样将内存中的索引库的数据同步回磁盘。

               Directory RAMdir = newRAMDirectory();

              Analyzeranalyzer = new StandardAnalyzer(Version.LUCENE_30);

              IndexWriter  ramIndexWriter = new IndexWriter(directory,analyzer,

                            MaxFieldLength.LIMITED);

              //ramIndexWriter.update.delete... 更新索引库

              /*同步数据回磁盘 */

              DirectoryfsDir = FSDirectory.open(new File("./indexDir/"));

              IndexWriter  fsIndexWriter = new IndexWriter(directory,analyzer, MaxFieldLength.LIMITED);

              fsIndexWriter.addIndexesNoOptimize(RAMdir);

             

              以上是一种默认情况,就是 fsIndexWriter 会采用创建或追加的方式来同步数据。

             -- 当磁盘上不存在对于索引库时则创建,并同步数据;否则,则追加和更新改变后的数据。

              IndexWriter的另一个构造其可以改变这种默认形式:

              IndexWriter  fsIndexWriter =

              new IndexWriter(directory,analyzer, [true | false], MaxFieldLength.LIMITED);

                     [true| false]: 若设置为 true,将总是创建或覆盖磁盘上的索引库。

               -- 当磁盘上不存在对于索引库时则创建,并同步数据;否则,则覆盖掉原有的索引库的全部数据。

                     若设置为 false。则只追加和更新改变后的数据。若原有数据库不存在,将报错。

     因此,一般用默认的就行了。true 的话要慎用。因为每次都推到重来,数据量很大的话,时间会比较久。

分享到:
评论

相关推荐

    lucene、lucene.NET详细使用与优化详解

    《lucene、lucene.NET 详细使用与优化详解》 lucene 是一个广泛使用的全文搜索引擎库,其.NET版本称为lucene.NET,它提供了强大的文本检索和分析能力,适用于各种场景下的全文搜索需求。lucene 并非一个可以直接...

    lucene排序、设置权重、优化、分布式搜索.pdf

    Lucene 排序、设置权重、优化、分布式搜索 Lucene 是一个高性能的搜索引擎库,它提供了强大的文本搜索和索引能力。下面我们将详细介绍 Lucene 的排序、设置权重、优化和分布式搜索等知识点。 一、Lucene 排序 ...

    经典的lucene实例代码及详细解析以及lucene结构流程介绍

    Lucene优化是指对Lucene索引和搜索进行优化的过程。Lucene提供了多种优化方式,包括索引优化、搜索优化和缓存优化等。 在上面的代码中,我们使用了`optimize()`方法对索引进行优化。该方法将合并磁盘上的索引文件,...

    lucene全文检索案例源码

    四、Lucene优化技巧 - 使用合适的Analyzer:不同的Analyzer会影响分词效果,选择合适的Analyzer可以提高检索准确度。 - 增量索引:在大型数据集上,应采用增量索引策略,避免一次性加载所有数据。 - 使用自定义...

    Lucene-core-2.0.0.jar

    在2.0.0版本中,Lucene优化了索引构建过程,提升了索引速度。它采用了倒排索引(Inverted Index)结构,这是一种将文档中出现的词及其位置存储在索引中的数据结构,使得查找匹配文档变得高效。此外,此版本还支持多...

    搜索引擎开发现实文档(lucene)

    4. Lucene 优化:Lucene 优化是指对 Lucene 的配置和参数进行调整,以提高搜索效率。 Lucene 相关产品 1. Apache Lucene:Apache Lucene 是一个开源的信息搜索库。 2. Elasticsearch:Elasticsearch 是一个基于 ...

    Lucene+3.0+原理与代码分析完整版

    **段合并**是Lucene优化索引性能的关键步骤之一,主要包括以下过程: 1. **选择合并**:决定哪些分段需要合并。 2. **执行合并**:将选中的分段合并成一个新的更大的分段。 3. **更新索引**:更新索引信息以反映...

    基于LUCENE的搜索引擎的设计与实现源代码

    三、LUCENE优化技巧 1. **多线程索引**:为了加快索引速度,可以利用多线程并行处理文档。 2. **块级并发**:LUCENE支持在索引过程中对不同段进行并发操作,进一步提高效率。 3. **内存管理**:合理设置缓存大小...

    lucene的资料

    3. **电子商务**:在线商店可以利用Lucene优化商品搜索,提高用户体验。 4. **内容管理**:新闻门户、博客平台等可以集成Lucene来提高内容的搜索效率。 5. **搜索引擎后端**:虽然Lucene本身不是一个完整的搜索...

    Struts2.3.8整合Hibernate4.2,Spring3.2lucene 3 6 2 SSH整合1.0版

    在这个版本中,Lucene优化了搜索速度,增强了对多核心CPU的利用,同时提供了更精确的搜索结果排序。开发者可以利用Lucene进行文本分析、建立倒排索引、执行布尔查询等多种操作。 SSH整合是指将这三个框架集成在一起...

    lucene索引库查看器5.3.0

    6. **了解存储结构**:通过“Segments”选项卡,可以了解索引的分段情况,这是Lucene优化索引存储的关键部分。 7. **导出数据**:如果需要,还可以将索引数据导出为CSV或其他格式,以便进一步分析。 总的来说,...

    lucene分组查询优化facet

    本篇文章将详细探讨Lucene的分组查询优化,以及如何使用Facet功能来提升用户体验。 一、Lucene分组查询原理 Lucene的分组查询(Faceting)是通过对索引中的文档进行多级分类来实现的。它首先会计算每个分面值的文档...

    lucene 搜索 实例

    三、Lucene优化与扩展 1. 倒排索引优化:通过设置不同的PostingList格式和压缩方式,如BlockTree或PForDelta,可以优化存储效率。 2. 多字段搜索:通过在QueryParser中指定多个字段,可以实现多字段的联合搜索。 ...

    Lucene+nutch开发自己的搜索引擎 part2

    6. **内存缓存与磁盘存储**:Lucene优化了内存和磁盘的使用,允许快速读取索引,同时保持索引的持久化。 Nutch则是一个基于Lucene的开源网络爬虫,它的主要任务是抓取网页并建立索引。Nutch的知识点包括: 1. **...

    lucene3.6.1源码

    四、Lucene优化与扩展 1. 基于内存的缓存:为了提升搜索性能,Lucene提供了Term频率和文档频率的缓存,以减少磁盘I/O。 2. 近实时搜索(Near Real-Time Search):通过NRTManager,用户可以在索引过程中获取最新的...

    lucene的封装和性能优化

    **Lucene封装与性能优化详解** Lucene是一个高性能、全文本搜索库,它为开发者提供了在应用程序中实现全文检索的功能。然而,为了更好地适应实际项目需求,通常需要对其进行封装,以便于管理和提升性能。本文将深入...

    智能提示框学习记录,附带工程源码---结合lucene全文检索

    在IT行业中,智能提示框是一种常见且实用的功能,它能够为用户提供实时的搜索建议或自动...通过实际操作,你可以学习到如何使用lucene优化搜索效率,以及如何将这种高级搜索功能集成到你的Web应用中,提高用户体验。

    基于Lucene的医疗搜索引擎排序算法的研究.rar

    本文将深入探讨如何利用Lucene优化医疗搜索引擎的排序算法,以提升搜索质量和用户体验。 首先,理解Lucene的基本工作原理是关键。Lucene通过索引文档内容,实现了快速的全文检索。它将文本分词,创建倒排索引,从而...

    LuceneJar5.3.1+IKAnalyzer2012_u6

    在5.3.1这个版本中,Lucene优化了内存占用,提升了搜索性能,并增强了对多语言的支持。 另一方面,IKAnalyzer是一个基于Java的开源中文分词器,专为满足Java环境下中文处理的需求而设计。2012_u6是其一个较新的版本...

Global site tag (gtag.js) - Google Analytics