WEB开发网
开发学院软件开发Java 深入浅出 jackrabbit 六 文本提取(上) 阅读

深入浅出 jackrabbit 六 文本提取(上)

 2009-09-17 00:00:00 来源:WEB开发网   
核心提示: 额的神啊,啥都没有,深入浅出 jackrabbit 六 文本提取(上)(5),就创建了一个LazyTextExtractorField类(还记得supportHighlighting参数吗,不记得的话再回头看看前面的文章),其实它是调用了,考虑到这里的reader是TextExtractorRe

额的神啊,啥都没有,就创建了一个LazyTextExtractorField类(还记得supportHighlighting参数吗,不记得的话再回头看看前面的文章),也就是说我们不得不再去看看LazyTextExtractorField这个类,但是我们有种感觉,快要看到我们想看到的东西了,这个继承实现了lucene中的AbstractField,结合上面的doc.add方法,我们可以想象得到,真正触发提取线程工作的应该是 lucene,lucene一定会调用LazyTextExtractorField类中的某个方法,以得到值,而这个时候,如果有文本提取的任务,那么应该会触发它,然后改方法先返回空字符串,把残缺版的document先加入索引中,等待提取完成后,再由前面提到的消费者把残缺版的document数据从索引中删除,再把完整版的document加入到索引中。

上面说到的索引时触发文本提取操作只是一种触发方式,通过阅读源代码,我们还可以发现第二种触发方式,那就是在AbstractIndex的 addDocument方法中,会判断,如果提取超过100ms,就把document拷贝一份,把copy的document加入到index中,然后把原始的document加入到indexingQueue队列中。这个时候,提取线程继续为这个原始的document执行提取操作。

那么我们先来看第一种触发,lucene触发,下面这个方法是LazyTextExtractorField中的方法,这个方法被lucene调用,用以分词, ahuaxuan已经在关键的代码中加入了注释:

Java代码   

public String stringValue() { 
    if (extract == null) { 
      StringBuffer textExtract = new StringBuffer(); 
      char[] buffer = new char[1024]; 
      int len; 
      try { 
  /*这里的读取操作有一定的迷惑性,其实它是调用了,考虑到这里的reader是TextExtractorReader,所以耗无疑问,这里的方法一定是调用了TextExtractorReader#read */        
while ((len = reader.read(buffer)) > -1) { 
          textExtract.append(buffer, 0, len); 
        } 
      } catch (IOException e) { 
        log.warn("Exception reading value for field: " 
            + e.getMessage()); 
        log.debug("Dump:", e); 
      } finally { 
        try { 
          reader.close(); 
        } catch (IOException e) { 
          // ignore 
        } 
      } 
      extract = textExtract.toString(); 
    } 
    return extract; 
  }

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

Tags:深入浅出 jackrabbit 文本

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