2013-02-28 31 views
3

我發現了一些與此問題相關的解決方案。正如我將解釋的,相關的解決方案對我來說不起作用。 (我正在使用Solr 4.0並將索引數據存儲在Oracle 11g數據庫中。)如何使用Solr 4.0+對包含爲數據庫BLOB的富文件格式的文檔進行索引?

Jonck van der Kogel的相關解決方案(從2009年開始)解釋爲here。他介紹了創建一個自定義Transformer,有點像Solr附帶的ClobTransformer。這是優雅的道路,但沒有使用現在與Solr集成的Tika。 (他使用外部PDFBox和FontBox。)這會創建多個維護/升級依賴關係。另外,除了PDF之外,我還需要能夠索引Word文檔。

由於Kogel的解決方案似乎在正確的道路上,有沒有辦法在定製變壓器中使用包含在Solr中的Tika類?這將允許Kogel優雅的數據庫解決方案提供所有的Tika功能。

另一個相關解決方案是隨Solr提供的ExtractingRequestHandler(ERH)。然而,顧名思義,這是一個請求處理程序,例如處理富文本文檔的HTTP帖子。以這種方式從數據庫中提取文檔具有性能和安全問題。我將不得不通過HTTP訪問數據庫BLOB。我沒有發現使用ERH從數據庫BLOB直接獲取的討論。是否有可能直接從數據庫BLOB與Solr細胞攝取?

另一個相關的解決方案是編寫一個Transformer(如上面的Kogel's)將字節[]轉換爲字符串(來自DataImportHandler FAQ)。使用真正的二進制文檔,這會將垃圾送入索引,並且不會像Tika那樣正確提取文本元素。將無法工作。

最終的相關解決方案是由RichDocumentHandler提供的UpdateRichDocuments。這已被棄用,不再在Solr中可用。該頁面將您引向ExtractingRequestHandler(如上所述)。

看來正確的解決方案是使用DataImportHandler和使用Tika類的客戶變壓器。這個怎麼用?

回答

4

幾個小時後......首先,在這個問題上有很多誤導,錯誤和無用的信息。沒有網頁似乎在一個地方提供了一切。所有這些信息都是有意爲之,但是在不同的版本之間,有些則超出了我的頭腦,但並沒有解決問題。這裏是我學到的東西和解決方案的集合。 重申,我使用的是Solr 4.0(在Tomcat上)+ Oracle 11g。

解決方案概述:DataImportHandler + TikaEntityProcessor + FieldStreamDataSource

步驟1,請確保您更新solrconfig.xml,這樣的Solr可以找到TikaEntityProcessor + DataImportHandler + Solr的細胞東西。

<lib dir="../contrib/dataimporthandler/lib" regex=".*\.jar" /> 
<!-- will include extras (where TikaEntPro is) and regular DIH --> 
<lib dir="../dist/" regex="apache-solr-dataimporthandler-.*\.jar" /> 
<lib dir="../contrib/extraction/lib" regex=".*\.jar" /> 
<lib dir="../dist/" regex="apache-solr-cell-\d.*\.jar" /> 

步驟2,修改data-config.xml,包括您的BLOB表。這是我遇到最多麻煩的地方,因爲這個問題的解決方案已經改變很多,因爲版本已經改變。另外,使用多個數據源並將它們正確地連接在一起對我而言並不直觀。一旦完成,非常光滑。請務必在此更換你的IP,SID名,用戶名,密碼,表名等

<dataConfig> 
    <dataSource name="dastream" type="FieldStreamDataSource" /> 
    <dataSource name="db" type="JdbcDataSource" 
    driver="oracle.jdbc.OracleDriver" 
    url="jdbc:oracle:thin:@192.1.1.1:1521:sid" 
    user="username" 
    password="password"/> 
    <document> 
    <entity 
     name="attachments" 
     query="select * from schema.attachment_table" 
     dataSource="db"> 
     <entity 
     name="attachment" 
     dataSource="dastream" 
     processor="TikaEntityProcessor" 
     url="blob_column" 
     dataField="attachments.BLOB_COLUMN" 
     format="text"> 
     <field column="text" name="body" /> 
     </entity> 
    </entity> 
    <entity name="unrelated" query="select * from another_table" dataSource="db"> 
    </entity> 
    </document> 
</dataConfig> 

的重要注意事項。如果您在嘗試導入時出現"No field available for name : whatever"錯誤,則FieldStreamDataSource無法解析您提供的數據字段名稱。對於我來說,我必須將url屬性設置爲小寫字母名稱,然後將dataField屬性設置爲outside_entity_name.UPPERCASE_BLOB_COLUMN。此外,一旦我的列名錯誤,這也會導致問題。

步驟3,您需要修改schema.xml以添加BLOB列字段(以及需要索引/存儲的任何其他列)。根據您的需求進行修改。

<field name="body" type="text_en" indexed="false" stored="false" /> 
<field name="attach_desc" type="text_general" indexed="true" stored="true" /> 

<field name="text" type="text_en" indexed="true" stored="false" multiValued="true" /> 
<field name="content" type="text_general" indexed="false" stored="true" multiValued="true" /> 

<copyField source="body" dest="text" /> 
<copyField source="body" dest="content" /> 

有了,你應該用自己的方式來節省很多時間讓被存儲在使用Solr索引的數據庫列的BLOB二進制文件,富文本文件(又名豐富的文檔)。

2

提卡和DIH的整合是通過TikaEntityProcessor

整合已經具備的Solr - SOLR-1358
斑點處理 - SOLR-1737

你只是需要找到合適的組合。

+0

我怎麼沒有找到這個?無論如何,我會看看我是否可以把這個工作,如果是的話,我會回來接受。謝謝 – DarkerIvy 2013-03-01 20:09:46