WEB开发网
开发学院软件开发Java 深入浅出 jackrabbit 八 索引合并(上) 阅读

深入浅出 jackrabbit 八 索引合并(上)

 2009-09-17 00:00:00 来源:WEB开发网   
核心提示: 即 new IndexBucket(0 100 , rue ) 第二个则为: new IndexBucket(101, 100*10, t rue ) 第三个则为: new IndexBucket(1001, 100*10*10, t rue ) 第四个则为: new IndexBucket(1

即 new IndexBucket(0 100 , rue )

第二个则为: new IndexBucket(101, 100*10, t rue )

第三个则为: new IndexBucket(1001, 100*10*10, t rue )

第四个则为: new IndexBucket(10001, 100*10*10*10, t rue )

第五个则为: new IndexBucket(100001, 100*10*10*10*10, t rue )

````````````

一直持续下去直到 upper 小于 2147483647 ,且是 10 的最大幂。那么就是说 10 亿,当一个目录中有 10 亿个 document 的 index 数据时,这个目录将不再参与 merge 过程, indexBuckets 中总共有 8 个 IndexBucket, 不过在循环外面还有两个创建 IndexBucket 的语句,不过这两个都是不允许参加合并的,所以第 3 个参数是 false ,也就是说一共有 10 个,第九个是:

Java代码  

new IndexBucket(1000000001, 2147483647, false)

那么第十个是:

Java代码

new IndexBucket(2147483648, 0x7fffffffffffffffL, false)

搞清楚 indexBuckets 的 初始化之后,我们再来看看第二个步骤,把根据 docNums 把对应的persistentindex 加入到 IndexBucket 中 :

Java代码   

// put index in bucket 
 
      IndexBucket bucket = (IndexBucket) indexBuckets.get(indexBuckets.size() - 1); 
 
      for (int i = 0; i < indexBuckets.size(); i++) { 
 
        bucket = (IndexBucket) indexBuckets.get(i); 
 
        if (bucket.fits(numDocs)) { 
          break; 
        } 
      } 
 
/*如果indexBuckets 没有值,那么就把Index 添加到第10个IndexBucket中,否则就从indexBuckets 的第一IndexBucket开始匹配,根据numDocs的值放到对应的IndexBucket中。*/ 
 
      bucket.add(new Index(name, numDocs)); 
 
      if (log.isDebugEnabled()) { 
        log.debug("index added: name=" + name + ", numDocs=" + numDocs); 
 
      } 
 
      // if bucket does not allow merge, we don't have to continue 
 
//如果是最后两个IndexBucket,那么即刻退出 
      if (!bucket.allowsMerge()) { 
        return; 
      } 
 
 
 
/*这段代码没有什么难的,接着看第3个步骤: 
*/      // check if we need a merge 
//超过indexbucket中超过10个元素<其实就是10个目录>则开始合并 
 
      if (bucket.size() >= mergeFactor) { 
 
        long targetMergeDocs = bucket.upper; 
        targetMergeDocs = Math.min(targetMergeDocs * mergeFactor, maxMergeDocs); 
 
        // sum up docs in bucket 
 
        List indexesToMerge = new ArrayList(); 
 
        int mergeDocs = 0; 
 
        for (Iterator it = bucket.iterator(); it.hasNext() && mergeDocs <= targetMergeDocs;) { 
 
          indexesToMerge.add(it.next()); 
 
        } 
/* 结合上下文,indexesToMerge.size()这值会小于2吗?????*/ 
        if (indexesToMerge.size() > 2) { 
 
          // found merge 
 
          Index[] idxs = (Index[]) indexesToMerge.toArray(new Index[indexesToMerge.size()]); 
 
          bucket.removeAll(indexesToMerge); 
 
          if (log.isDebugEnabled()) { 
 
            log.debug("requesting merge for " + indexesToMerge); 
 
          } 
 
          mergeTasks.add(new Merge(idxs)); 
 
          log.debug("merge queue now contains " + mergeTasks.size() + " tasks."); 
        } 
      }

上一页  1 2 3 4 5 6 7  下一页

Tags:深入浅出 jackrabbit 索引

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接