SolrInputDocument / tika提取对于索引许多文档很慢

时间:2014-02-25 23:38:16

标签: solr apache-tika

我正在使用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);
      }                     

2 个答案:

答案 0 :(得分:1)

正如cheffe所说,你现在不能在DIH中使用多个线程(过去有可能这样做但是有缺陷并被删除了)。所以你最好的选择是:

  1. 使用tika在自己的客户端程序中进行提取
  2. 使用SolrJ api发送给solr
  3. 你在多个线程中执行此操作,调整数字,直到看到最佳方案。同时调整通常的lucene / solr配置索引throuput(remBufferSizeMB等)

答案 1 :(得分:0)

尝试使用显式的HtmlParser替换AutoDetectParser。我最近发现自动检测过程可能非常慢,似乎多次加载文件。