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

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

 2009-09-17 00:00:00 来源:WEB开发网   
核心提示: 为了解决这个问题,在jackrabbit中引入了异步处理文本提取任务的功能(它必须是异步的吗?当然不,深入浅出 jackrabbit 六 文本提取(上)(2),jackrabbit也提供了同步的选择,但是本文主要阐述异步提取的功能,reader=((PooledTextExtractor)ext

为了解决这个问题,在jackrabbit中引入了异步处理文本提取任务的功能(它必须是异步的吗?当然不,jackrabbit也提供了同步的选择,但是本文主要阐述异步提取的功能,所以在下面的文章中我们假设我们配置异步提取的功能),说到这里,我们不得不再说说他是怎么个异步法的呢?它是异步提取,然后由处理提取的线程负责把这个document重新加入到index中呢,还是提取的线程只负责提取,提取完成之后再把提取完成的document交给专门的线程去add到document中呢。

后者,当然是后者,提取的线程只负责提取,有专门的线程来负责更新document到index中。如果说观察者模式是设计模式中的皇后,那么 ahuaxuan可以说,生产消费模型是编程模型中的皇后,它无处不在(您要是天天写crud的话,ahuaxuan很难保证它无处不在)。

在前面的文章中,我们一直在提MultiIndex#indexingqueue,而且一直没有详细解释indexingqueue的功能。其实它就是在异步文本提取中充当着消费队列的职责,提取线程(生产者)再文本提取完成之后,会把document加入到indexingqueue中。那么消费者线程就负责定时的从indexingqueue中取出一件准备好的document,并执行multiindex#update方法。

我们先来看看提取文本是怎么做的。再次回到NodeIndexer类的addBinary方法,我相信大家对这个方法还有印象,他负责创建一个名字叫jcr:data的field。他的值就是来自于二进制文件,比如pdf,doc等等:

Java代码   

protected void addBinaryValue(Document doc, 
                 String fieldName, 
                 Object internalValue) { 
    ……………………………………………….. 
    
        Reader reader; 
        if (extractor instanceof PooledTextExtractor) { 
//从类名上我们也可以看出点端倪,这里貌似有个线程池。 
          reader = ((PooledTextExtractor)extractor).extractText(stream, type, encoding, node.getNodeId().getUUID().toString()); 
        } else { 
//忽视这个else,假设只进入if,          reader = extractor.extractText(stream, type, encoding); 
        } 
//这个createFulltextField方法非常之相当重要。后面会讲到 
        doc.add(createFulltextField(reader)); 
      …………………………………………………………….. 
  } 

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

Tags:深入浅出 jackrabbit 文本

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