限制在 Tika 中解析的嵌入式文件的数量
Limit the number of Embedded files to be parsed in Tika
在创建自定义 EmbeddedDocumentExtractor class 时,我需要解析文件中的嵌入文档并对有限数量的嵌入文档(比如 10 个)执行一些操作。
如果我处理一个包含 1000 个嵌入的文件,每个嵌入都会被处理,这绝对是浪费时间。有没有办法限制只解析前几个嵌入文件?
public void parseEmbedded(InputStream stream, ContentHandler handler, Metadata metadata, boolean outputHtml) throws SAXException, IOException {
if(fileCount >= COUNT_LIMIT){
//skip file
}
else{
//perform op
}
}
通过这种方法,比较文件计数(已处理的嵌入文件的数量)和 COUNT_LIMIT 实际上需要时间,而不是让进程停止。
OP 提问后更新:
我了解到您已经在定制 class 来实现 tika 的 EmbeddedDocumentExtractor
,在您开始提问时:
"On creating a custom EmbeddedDocumentExtractor class, "
所以查看 tika github 我看到 EmbeddedDocumentExtractor
是由一个名为 ParsingEmbeddedDocumentExtractor
的 class 实现的接口,它有一个具体的方法 parseEmbedded
。我假设这是您要使用的方法,但限制为 n .
我建议您自定义 class 实现 EmbeddedDocumentExtractor
并继承自 ParsingEmbeddedDocumentExtractor
。在这个 class 上定义一个名为 COUNT_LIMIT 的变量。然后重写 parseEmbedded 方法以执行以下操作:
- 分离 InputStream 中的文件
- 将这些分离的文件放入使用限制的for循环中
- 对每个文件调用父方法。
所以它看起来像这样:
class MyEmbeddedDocumentExtractor implements EmbeddedDocumentExtractor extends ParsingEmbeddedDocumentExtractor{
private static int COUNT_LIMIT = 10;
...
@Override parseEmbedded(
InputStream stream, ContentHandler handler, Metadata metadata, boolean outputHtml)
throws SAXException, IOException {
// separate the files in the InputStream
for(int i = 0; i < COUNT_LIMIT; i++){
super.parseEmbedded(streamOfOneFile, handler, metadata, outputHtml)
}
}
}
根据您的需要,也许可以尝试 RecursiveParserWrapper;您可以在 RecursiveParserWrapperHandler 中设置最大嵌入深度。参见示例:https://github.com/apache/tika/blob/2d73e91476325c235dc9a9be116e8d02c7658850/tika-parsers/src/test/java/org/apache/tika/parser/RecursiveParserWrapperTest.java#L204
在创建自定义 EmbeddedDocumentExtractor class 时,我需要解析文件中的嵌入文档并对有限数量的嵌入文档(比如 10 个)执行一些操作。
如果我处理一个包含 1000 个嵌入的文件,每个嵌入都会被处理,这绝对是浪费时间。有没有办法限制只解析前几个嵌入文件?
public void parseEmbedded(InputStream stream, ContentHandler handler, Metadata metadata, boolean outputHtml) throws SAXException, IOException {
if(fileCount >= COUNT_LIMIT){
//skip file
}
else{
//perform op
}
}
通过这种方法,比较文件计数(已处理的嵌入文件的数量)和 COUNT_LIMIT 实际上需要时间,而不是让进程停止。
OP 提问后更新:
我了解到您已经在定制 class 来实现 tika 的 EmbeddedDocumentExtractor
,在您开始提问时:
"On creating a custom EmbeddedDocumentExtractor class, "
所以查看 tika github 我看到 EmbeddedDocumentExtractor
是由一个名为 ParsingEmbeddedDocumentExtractor
的 class 实现的接口,它有一个具体的方法 parseEmbedded
。我假设这是您要使用的方法,但限制为 n .
我建议您自定义 class 实现 EmbeddedDocumentExtractor
并继承自 ParsingEmbeddedDocumentExtractor
。在这个 class 上定义一个名为 COUNT_LIMIT 的变量。然后重写 parseEmbedded 方法以执行以下操作:
- 分离 InputStream 中的文件
- 将这些分离的文件放入使用限制的for循环中
- 对每个文件调用父方法。
所以它看起来像这样:
class MyEmbeddedDocumentExtractor implements EmbeddedDocumentExtractor extends ParsingEmbeddedDocumentExtractor{
private static int COUNT_LIMIT = 10;
...
@Override parseEmbedded(
InputStream stream, ContentHandler handler, Metadata metadata, boolean outputHtml)
throws SAXException, IOException {
// separate the files in the InputStream
for(int i = 0; i < COUNT_LIMIT; i++){
super.parseEmbedded(streamOfOneFile, handler, metadata, outputHtml)
}
}
}
根据您的需要,也许可以尝试 RecursiveParserWrapper;您可以在 RecursiveParserWrapperHandler 中设置最大嵌入深度。参见示例:https://github.com/apache/tika/blob/2d73e91476325c235dc9a9be116e8d02c7658850/tika-parsers/src/test/java/org/apache/tika/parser/RecursiveParserWrapperTest.java#L204