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

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

 2009-09-17 00:00:00 来源:WEB开发网   
核心提示: 看到这里爱思考的同学们一定会意识到这里还漏了什么,是什么呢?前面讲到,深入浅出 jackrabbit 八 索引合并(上)(6),一个 bucket 中超过 10 个目录,会被合并一个新的目录,罗嗦一句,一个PersistentIndex代表一个目录*/executeAndLog(newCreat

看到这里爱思考的同学们一定会意识到这里还漏了什么,是什么呢?前面讲到,一个 bucket 中超过 10 个目录,会被合并一个新的目录,那么也就是说这个新目录中至少有 1000 个 document 的索引数据,这样下来,如果我有 100000 个节点,而且恰好每个目录中之后 1000 个 document 的数据,那么就得用 100 个目录来存储数据了。这样带来的问题是,每做一次查询,都需要把 100 个 indexReader 传给 search ,即使使用多线程并行搜索,那目录数也还是太多了,而且如果是 100w 个节点,那就更不得了了,所以 jackrabbit 中一定还有机制会把这些目录合并成更大目录的逻辑。为什么这么说,因为之前在创建 indexbucket 中的时候,分了 8 个允许合并的段,而上面的逻辑只会用到前面一个 bucket ,后面的几个肯定是有用处的,那么是谁来触发它们的,它们在哪里呢?

我们看到在上面的 run 方法中,我们有一个方法没有讲到: multiIndex .replaceIndexes(names, index, deletedDocuments );

我们将会在这个方法中寻找到真相,同样, ahuaxuan 在代码中加入了自己的注释

/* obsoleteIndexes 是需要被删除的 dir ,因为他们的数据已经被合并到新的目录里, index 参数则表示那个对应那个新目录的 PersistentIndex , deleted 表示需要被删除的类 */

Java代码   

void replaceIndexes(String[] obsoleteIndexes, 
            PersistentIndex index, 
            Collection deleted) 
 
      throws IOException { 
 
/*在multiIndex中,到处都是synchronized ,而且都是锁定multiindex对象,为啥呢? 详见后文*/ 
 
    synchronized (this) { 
 
/*这段代码在multiIndex#update方法中也出现过,你知道它的用途吗,其实可以猜出来*/ 
 
      synchronized (updateMonitor) { 
        updateInProgress = true; 
      } 
      try { 
 
        // if we are reindexing there is already an active transaction 
 
        if (!reindexing) { 
 
          executeAndLog(new Start(Action.INTERNAL_TRANS_REPL_INDEXES)); 
 
        } 
 
        // delete obsolete indexes 
 
/*10个目录已经合并成一个了,那这个10个目录该删的就删,不需要犹豫*/ 
 
        Set names = new HashSet(Arrays.asList(obsoleteIndexes)); 
 
        for (Iterator it = names.iterator(); it.hasNext();) { 
 
          // do not try to delete indexes that are already gone 
 
          String indexName = (String) it.next(); 
 
          if (indexNames.contains(indexName)) { 
            executeAndLog(new DeleteIndex(getTransactionId(), indexName)); 
          } 
 
        } 
 
         // Index merger does not log an action when it creates the target 
 
        // index of the merge. We have to do this here. 
 
/*还记得CreateIndex的作用吗?复习一下:根据名字获取PersistentIndex对象,如果名字不存在或者为null,则新建一个PersistentIndex对象,罗嗦一句,一个PersistentIndex代表一个目录*/ 
 
        executeAndLog(new CreateIndex(getTransactionId(), index.getName())); 
  
/*又来了AddIndex对象,还记得它的作用吗,将这个persistentIndex加入到*/ 
 
        executeAndLog(new AddIndex(getTransactionId(), index.getName())); 
 
        // delete documents in index 
 
        for (Iterator it = deleted.iterator(); it.hasNext();) { 
          Term id = (Term) it.next(); 
          index.removeDocument(id); 
        } 
 
        index.commit(); 
 
        if (!reindexing) { 
          // only commit if we are not reindexing 
          // when reindexing the final commit is done at the very end 
          executeAndLog(new Commit(getTransactionId())); 
        } 
 
      } finally { 
        synchronized (updateMonitor) { 
          updateInProgress = false; 
          updateMonitor.notifyAll(); 
          releaseMultiReader(); 
        } 
      } 
    } 
 
    if (reindexing) { 
      // do some cleanup right away when reindexing 
      attemptDelete(); 
    } 
  }

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

Tags:深入浅出 jackrabbit 索引

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