【问题标题】:SolrInputDocument/tika Extraction is slow for indexing many documentsSolrInputDocument/tika 提取对许多文档的索引很慢
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 我删除了 UpdateRequest updrequest = new UpdateRequest("/update");我将 solrinputdocument 直接传递给 solr,例如: solr.add(solrinputdocument);这开始运行得非常快。我们也可以通过删除更新请求来做到这一点。 solr.add(solrinputdocument) 是否会将完整文档索引到 solr?
【解决方案2】:

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

【讨论】:

猜你喜欢
  • 2019-11-21
  • 1970-01-01
  • 2020-05-05
  • 2015-07-16
  • 2017-10-18
  • 1970-01-01
  • 2019-02-21
  • 1970-01-01
  • 2016-03-02
相关资源
最近更新 更多