深入浅出 jackrabbit 六 文本提取(上)
2009-09-17 00:00:00 来源:WEB开发网额的神啊,啥都没有,就创建了一个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;
}
Tags:深入浅出 jackrabbit 文本
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接