`
realeasy
  • 浏览: 3258 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

对lucene in action 和其他书里面对于mergeFactor讲解的质疑

阅读更多
java 代码

   最近要做搜索了,而且公司用的就是lucene,所以自己先学习一番,看了lucene in action和今天买的一本lucene2.0+heritrix,上面对mergeFactor都是这样说的“每向索引添加mergeFactor个document时,就会有一个新的segment在磁盘建立起来......"。而对于minMergeDocs都是一笔带过,说是限制内存中文档的数量。
    于是我就开始奇怪了,这两个值这么一来不就冲突了吗,两个值一样的功能,于是乎我就做了几个试验,我有81个document,然后我把mergeFactor设置为5,把minMergeDocs设置为8,把maxMergeDocs设置为45。按照书上的讲,这样每5个doc就会生成一个segment,事实怎么样呢[code]package org.apache.lucene.demo;

[code]

/**
 * Copyright 2004 The Apache Software Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.IndexWriter;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Date;

class IndexFiles {
 public static void main(String[] args) throws IOException {
  String usage = "java " + IndexFiles.class + " <root_directory>";
  if (args.length == 0) {
   System.err.println("Usage: " + usage);
   System.exit(1);
  }

  Date start = new Date();
  try {
   File INDEX_DIR = new File(args[0]);
   if (INDEX_DIR.exists()) {
    INDEX_DIR.delete();
   }
   IndexWriter writer = new IndexWriter("index",
     new StandardAnalyzer(), true);
   writer.setUseCompoundFile(false);
   writer.mergeFactor = 5;
   writer.maxMergeDocs = 40;
   writer.minMergeDocs = 8;
   indexDocs(writer, INDEX_DIR);

//   writer.optimize();
   writer.close();

   Date end = new Date();

   System.out.print(end.getTime() - start.getTime());
   System.out.println(" total milliseconds");

  } catch (IOException e) {
   System.out.println(" caught a " + e.getClass()
     + "\n with message: " + e.getMessage());
  }
 }

 public static void indexDocs(IndexWriter writer, File file)
   throws IOException {
  // do not try to index files that cannot be read
  if (file.canRead()) {
   if (file.isDirectory()) {
    String[] files = file.list();
    // an IO error could occur
    if (files != null) {
     for (int i = 0; i < files.length; i++) {
      indexDocs(writer, new File(file, files[i]));
     }
    }
   } else {

    try {
     if (file.getName().endsWith(".txt")) {
      System.out.println("adding " + file);
      writer.addDocument(FileDocument.Document(file));
     }
    }
    // at least on windows, some temporary files raise this
    // exception with an "access denied" message
    // checking if the file can be read doesn't help
    catch (FileNotFoundException fnfe) {
     ;
    }
   }
  }
 }
}
[/code]

debug他在 writer.addDocument(FileDocument.Document(file)); writer.addDocument(FileDocument.Document(file));
这里设上断点,然后发现在第5个document添加的时候并没有出现segment生成,而是在第8个document添加的时候出现了第一个segment的生成。接下来再做一个试验把这两个值倒过来,然后你就会发现这次,在第5个document添加的时候出现了第一个segment的生成。

      所以我认为,mergeFactor只是控制segment合并的,并不控制多少个document生成一个segement,而minMergeDocs是控制多少个document生成一个segement。

 

另外附上我自己写的一个计算产生segement数量的算法,写得比较匆忙,可能有不对的地方,另外有一条分支没有验证就是当maxMergeDocs<minMergeDocs时,我试验他就生成了一个segment不知道为啥。

 

java 代码
  1. package com.sina.easy.util;   
  2.   
  3. public class CountSegmentNum {   
  4.     private int docNum = 0;   
  5.   
  6.     private int mergefactor = 10;   
  7.   
  8.     private int maxMergeDocs = Integer.MAX_VALUE;   
  9.   
  10.     private int minMergeDocs = 10;   
  11.   
  12.     private int segmentNum = 0;   
  13.   
  14.     public CountSegmentNum(int docNum, int mergefactor, int maxMergeDocs,   
  15.             int minMergeDocs) {   
  16.         this.docNum = docNum;   
  17.         this.mergefactor = mergefactor;   
  18.         this.maxMergeDocs = maxMergeDocs;   
  19.         this.minMergeDocs = minMergeDocs;   
  20.     }   
  21.   
  22.     public void countNum() {   
  23.         int i = 1;   
  24.         int tempmerfactormulti = mergefactor;   
  25.         while (true) {   
  26.             if (docNum == 0) {   
  27.                 return;   
  28.             }   
  29.             if (docNum < minMergeDocs) {   
  30.                 segmentNum++;   
  31.                 return;   
  32.             }   
  33.             if (maxMergeDocs >= docNum) {   
  34.                 int x = docNum / minMergeDocs;   
  35.                 int z = x % mergefactor;   
  36.                 if (x >= mergefactor) {   
  37.                     segmentNum++;   
  38.                 }   
  39.                 segmentNum += z;   
  40.                 docNum = docNum % minMergeDocs;   
  41.             }else{   
  42.                 if(maxMergeDocs<minMergeDocs)   
  43.                 {   
  44.                     segmentNum = 1;                         //这条分支没有详细验证,不过实际应用应该没人这么用   
  45.                     return;   
  46.                 }   
  47.                 if(maxMergeDocs< tempmerfactormulti*minMergeDocs){   
  48.                     int nowmerfactor = tempmerfactormulti;   
  49.                     for(;i>=1;i--){   
  50.                         nowmerfactor = tempmerfactormulti/mergefactor;   
  51.                         segmentNum+=docNum/(nowmerfactor*minMergeDocs);   
  52.                         docNum = docNum%(nowmerfactor*minMergeDocs);   
  53.                     }   
  54.                 }else{   
  55.                     tempmerfactormulti = tempmerfactormulti*mergefactor;   
  56.                     i++;   
  57.                 }   
  58.             }      
  59.         }   
  60.     }   
  61.   
  62.     public int getSegmentNum() {   
  63.         return segmentNum;   
  64.     }   
  65.   
  66.     public static void main(String[] args) {   
  67.         CountSegmentNum csn = new CountSegmentNum(815604);   
  68.         csn.countNum();   
  69.         System.out.println(csn.getSegmentNum());   
  70.     }   
  71. }   
分享到:
评论
1 楼 realeasy 2007-11-21  
奇怪怎么没有贴全,第42行应该是
if(maxMergeDocs&lt;minmergedocs)&gt;

相关推荐

    lucene in action 2nd edition, lucene in action 第二版 PDF

    《Lucene in Action 第二版》是一本深入探讨Apache Lucene全文检索库的专业书籍,它在Java开发领域具有很高的权威性。这本书详细介绍了如何利用Lucene进行高效的文本搜索和索引构建,是Java开发者和信息检索爱好者的...

    lucene in action 第二版

    根据给定文件信息,这里将详细介绍关于《Lucene in Action 第二版》书籍的知识点。这本书是关于Java Lucene教程的,主要面向开发者学习使用Lucene进行搜索引擎开发。 ### 书名知识点: 《Lucene in Action 第二版...

    lucene in action 电子版

    - **目标读者**:对于那些从事搜索引擎开发或者希望在自己的应用中集成搜索功能的专业人士来说,“Lucene in Action”提供了一套完整的指南。 #### 二、Lucene的核心概念 - **章节1:初识Lucene** - **信息组织与...

    Lucene In Action 第二版 高清中文版+附书源代码

    《Lucene In Action 第二版》是一本深入探讨Apache Lucene全文搜索引擎库的专业书籍,高清中文版的提供为中文读者提供了便利。这本书由Michael McCandless等作者编写,旨在帮助开发者充分利用Lucene的强大功能,构建...

    lucene in action

    lucene in action lucene in action lucene in action lucene in action lucene in action lucene in action lucene in action lucene in action

    lucene in action源码2

    《Lucene in Action》是关于Apache Lucene搜索引擎库的一本经典著作,这本书深入浅出地讲解了Lucene的原理和应用。源代码是学习技术书籍的精髓所在,它能让我们直观地理解书中理论的实现过程。现在我们拥有《Lucene ...

    Lucene in action 2nd edition

    ### Lucene in Action 第二版:深度解析与实践指南 #### 概述 《Lucene in Action》第二版是一本全面介绍Apache Lucene 3.0的书籍,它被誉为是美国大学搜索引擎课程的标准教材之一。本书由Michael McCandless、...

    Lucene in Action 2nd Edition

    《Lucene in Action 2nd Edition MEAP.pdf》这个PDF文件很可能是书中的早期访问版章节,提供了书中的部分内容,读者可以从中了解Lucene的基本概念和实际操作,为后续深入学习和应用打下坚实基础。通过学习这本书,...

    lucene in action 2ed Edition

    接着,书中逐步引导读者安装、配置和使用Lucene,讲解如何创建索引、查询、排序和优化搜索性能。 在Java编程方面,书中的实例代码清晰易懂,涵盖了Lucene API的各个方面,包括文档的存储和分析、查询解析和执行、...

    Lucene in action 中文版

    在提供的压缩包子文件“lucene in action”中,可能包含了该书的电子版或其他相关文档。通常,这样的文件可能包含PDF、HTML、EPUB等形式的图书内容,方便用户在不同设备上阅读。然而,由于描述中提到“不是很全”,...

    Lucene in Action 2nd

    综上所述,《Lucene in Action》第二版针对 Apache Lucene 3.0 进行了全面而深入的介绍,无论对于初学者还是有一定经验的开发者来说都是一本非常有价值的参考书。通过学习本书,读者不仅可以掌握如何使用 Lucene ...

    lucene in action 书中例子源码

    《Lucene in Action》是一本深受开发者喜爱的书籍,它深入浅出地介绍了Apache Lucene这个全文搜索引擎库的使用和实现细节。这本书的实例代码涵盖了Lucene的核心功能和高级用法,是学习Lucene不可或缺的参考资料。...

    Lucene In Action

    10. **资料说明**:配套的“资料说明(必看).pdf”可能包含了对书中的练习、代码示例的解释,以及如何获取和运行示例程序的指导,对于深入学习非常有帮助。 总的来说,《Lucene In Action》是一本非常适合Java开发者...

    Lucene in Action 配套源码

    《Lucene in Action》是一本深受开发者欢迎的书籍,它深入浅出地介绍了Apache Lucene这个全文搜索引擎库的使用和实现原理。...这份源码涵盖了书中讲解的各种示例,对于学习和调试Lucene的用法非常有帮助。

    Lucene in Action英文版

    ### Lucene in Action 英文版 #### 一、理解Lucene - **定义与功能**:Lucene是一款强大的Java搜索库,它允许开发者轻松地为任何应用添加搜索功能。近年来,Lucene变得异常流行,并成为了最广泛使用的文档检索库之...

    Lucene In Action 2源码

    《Lucene In Action 2源码》是针对著名图书《Lucene In Action 2nd Edition》的配套代码资源,这本书是关于Apache Lucene全文搜索引擎库的一部经典之作。Lucene是一个开源的Java库,用于构建高性能、可扩展的信息...

    Lucene in Action第二版(中文和英文)

    《Lucene in Action》第二版是一本专注于开源全文搜索引擎库Lucene的专业著作,由美国的Otis Gospodnetic和Erik Hatcher共同撰写。这本书深入浅出地讲解了如何利用Lucene进行高效的文本搜索和索引构建,是Java开发者...

    中英文版 lucene in action (pdf 版,附随书源码)

    《Lucene in Action》是一本深受开发者欢迎的书籍,它深入浅出地介绍了Apache Lucene这个全文搜索引擎库的使用和实现原理。这本书分为中文和英文两个版本,为读者提供了全面了解和掌握Lucene的机会。PDF版包含了完整...

Global site tag (gtag.js) - Google Analytics