【发布时间】:2014-02-25 23:38:15
【问题描述】:
我正在使用 Solr 4.5。我正在尝试使用 Apache Tika 1.4 遍历多个 html 文件以从文件中提取数据。然后将这些元数据字段添加到 SolrInputDocument 。每次我必须循环文件并创建 SolrInputDocument 的实例。索引似乎很慢,我们有大量的文件要索引。我需要专家的建议。这是我正在使用的示例代码。
String urlString = "http://server/solr/";
SolrServer solr = new HttpSolrServer(urlString);
UpdateRequest updrequest = new UpdateRequest("/update");
//For tika extraction initialisation
BodyContentHandler handler = new BodyContentHandler(10 * 1024 * 1024);
AutoDetectParser autoparser = new AutoDetectParser();
Metadata metadata = new Metadata();
ParseContext parseContext = new ParseContext();
然后对于每个 html 文件,我调用我编写的 Tika 提取方法 ExtractData,并将我在此处初始化的每个对象与我的文件一起传递:
ExtractData(file,solr,updrequest,handler,autoparser,metadata,parseContext);
ExtractData的代码如下所示
public void ExtractData(String file,SolrServer solr,UpdateRequest updrequest,BodyContentHandler handler,AutoDetectParser autoparser,Metadata metadata,ParseContext parseContext) throws IOException,
SAXException, TikaException, SolrServerException {
SolrInputDocument solrinputdocument = new SolrInputDocument();
metadata.set(Metadata.CONTENT_TYPE, "text/html");
autoparser.parse(input, handler, metadata, parseContext);
//loop all metadata from the extraction and add the fields to the solr
String[] metadataNames = metadata.names();
for (String name : metadataNames) {
solrinputdocument.addField(name, metadata.get(name));
}
}
updrequest.add(solrinputdocument);
solr.request(updrequest);
}
【问题讨论】:
-
您是否尝试过多线程提取过程?因此,不要一个接一个地提取文档,而是并行提取它们。
-
再一次,正如 cheffe 所说,在不同的线程中同时提取内容。您也可以使用 ConcurrentUpdateSolrServer 来缓冲 SolrInputDocuments
-
有人可以告诉我如何为这种提取创建多线程方式。我从来没有在多线程工作过。请帮忙。
标签: solr apache-tika