2014-02-25 61 views
0

我正在使用Solr 4.5。我試圖通過多個html文件循環來使用Apache Tika 1.4從文件中提取數據。然後將這些元數據字段添加到SolrInputDocument。每次我必須循環文件並創建SolrInputDocument的實例。索引似乎非常慢,我們有大量的文件要索引。我需要這裏的專家建議。這是我正在使用的示例代碼。SolrInputDocument/tika提取很慢的索引許多文檔

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文件我打電話,我已經寫了蒂卡提取方法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); 
     }      
+0

您是否嘗試過多線程提取過程?所以並不是一個接一個地提取文檔。 – cheffe

+0

正如cheffe所說的,同時在不同的線程中提取內容。你也可以使用ConcurrentUpdateSolrServer來緩衝SolrInputDocuments – sidgate

+0

有人可以告訴我們如何創建一個多線程的方式來進行這種提取。我從來沒有在多線程中工作。請幫忙。 – user3161879

回答

1

正如cheffe所說,你不能在DIH中使用多線程(現在有可能這樣做)過去,但是是越野車,並被刪除)。所以最好的辦法是:

  1. 做蒂卡提取在其自己的客戶端程序
  2. 使用SolrJ API發送到Solr
  3. 你這樣做,在多線程,調整數量,直到你看到最佳場景。還要調整索引throuput的常用lucene/solr配置(remBufferSizeMB等)
+0

我刪除了行 UpdateRequest updrequest = new UpdateRequest(「/ update」); 我將solrinputdocument直接傳遞給solr,如:solr.add(solrinputdocument); 這開始運行非常快。我們可以通過刪除更新請求來做到這一點。 solr.add(solrinputdocument)是否會將完整文檔編入索引? – user3161879

0

嘗試用顯式HtmlParser替換AutoDetectParser。我最近發現自動檢測過程可能非常緩慢,似乎多次加載文件。

+0

難道是[這個Tika bug](https://issues.apache.org/jira/browse/TIKA-1568)?或者你有不同的問題? – Gagravarr