WEB开发网
开发学院软件开发Java 深入浅出 jackrabbit 二 索引概览 阅读

深入浅出 jackrabbit 二 索引概览

 2009-09-17 00:00:00 来源:WEB开发网   
核心提示: 这段代码很简单,把原来的两个iterator作了一个decorator,深入浅出 jackrabbit 二 索引概览(4),也就是说在原有的iterator的功能上又添加了一些功能,代码虽然很简单,究竟node中有哪些信息被放到索引中了呢,同时我们将会看到如何通过修改field的属性来降低高亮功

这段代码很简单,把原来的两个iterator作了一个decorator,也就是说在原有的iterator的功能上又添加了一些功能,代码虽然很简单,但是却很重要,尤其是在处理那些需要add的node上,在第二个decorator中,有一个next方法,这个方法包含着创建index的主要逻辑:创建属于这个node的document对象。为node创建document是索引过程中第一个最重要的环节,这意味着,我们需要掌握一个 node中,哪些属性被建立索引,建了那些索引,这关乎到查询的范围,如果一个property不能被索引,那么在查询的时候就不能以它作为依据。

所以请大家记住createDocument这个方法,在后文中,我们会详细分析一个node有哪些field会被索引进文件。

所以到目前为止,我们已经得知了index流程的前面三个步骤

Java代码   

1. 调用index流程的两个入口 
2. 监听器解析event,并生成两个iterator 
3. Decorate两个iterator,目的是override其next方法,并将在next方法中创建document。

接着,我们进入到index.update()方法,index对象是MultiIndex类的实例,对于update方法来说,无论用什么言语来描述它的重要性都不为过,因为在这个方法中,我们会看到jackrabbit建立索引的核心流程,但是我们需要知道的是,它并不包含任何细节,细节隐藏在流程的其他对象中:

//请注意方法前的synchronized,这个同步非常重要,因为他能控制一个非//常重要的流程的顺序执行。

Java代码   

synchronized void update(Iterator remove, Iterator add) throws IOException { 
    synchronized (updateMonitor) { 
      updateInProgress = true; 
    } 
    try { 
      long transactionId = nextTransactionId++; 
      executeAndLog(new Start(transactionId)); 
 
      boolean flush = false; 
  //从索引中删除需要删除的node 
      while (remove.hasNext()) { 
        executeAndLog(new DeleteNode(transactionId, (UUID) remove.next())); 
      } 
//将需要增加的node的document加入到索引中去,这里的next 
//方法就是上一个方法中定义的decorator中的next()方法,创建//document就是在此时 
      while (add.hasNext()) { 
        Document doc = (Document) add.next(); 
        if (doc != null) { 
          executeAndLog(new AddNode(transactionId, doc)); 
          // commit volatile index if needed 
          flush |= checkVolatileCommit(); 
        } 
      } 
      executeAndLog(new Commit(transactionId)); 
 
      // flush whole index when volatile index has been commited. 
      if (flush) { 
        flush(); 
      } 
    } finally { 
      synchronized (updateMonitor) { 
        updateInProgress = false; 
        updateMonitor.notifyAll(); 
        if (multiReader != null) { 
          multiReader.close(); 
          multiReader = null; 
        } 
      } 
    } 
  } 

从代码的注释,我们可以看到这段代码的主要功能,就是把该删的删掉,该加的加进去,然后该flush就flush,最后方法退出。那么代码的主要逻辑在哪里呢?

在DeleteNode和AddNode类中,还有就是在flush方法中。

看上去很简单了,但是这只是看上去简单而已,就到目前为止,这个以上流程的主要工作还停留在如何准备索引数据:即document,接着就是短短几行代码来描述如何使用document,

不过再继续下去之前,我们得回头看看createDocument中究竟有哪些field被创建,究竟node中有哪些信息被放到索引中了呢,同时我们将会看到如何通过修改field的属性来降低高亮功能所带来的时间消耗,to be continue。

上一页  1 2 3 4 

Tags:深入浅出 jackrabbit 索引

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