2014-07-23 83 views
4

讓我先說一說,我已經完成了關於此主題的所有內容,包括Solr文檔和所有SO問題。在Solr數據導入處理程序中定義嵌套實體

我有一個Solr實例,我用Data Import Hanlder設置了使用JDBC驅動程序從MSSQL中提取數據。數據進來,但我期望基於Solr的DIH文檔

<document> 
<entity> 
    <entity /> 
</entity> 
</document> 

我已經嘗試了所有像rootEntity屬性,壓平,用CachedSqlProvider等。隨着多值=」就可以不規整真正的」結果最終

docs [ 
{ 
    recordId: '1234', 
    name: 'whatever' 
    subrows_col1: ['x','y','z'] 
    subrows_col2: ['a','b','c'] 
} 
] 

當我在尋找

docs [ 
{ 
    recordId: '1234', 
    name: 'whatever' 
    subrows: [{ 
    col1: 'x', 
    col2: 'a' 
}, 
    { 
    col1: 'y', 
    col2: 'b' 
}, 
{ 
    col1: 'z', 
    col2: 'c' 
}] 
} ] 

我見過的塊加入的東西,但我很困惑,哪裏就有奇蹟。我添加了

<add> 
<doc> 
    <field /> 
    <doc> 
    <field /> 
    </doc> 
<doc> 
</add> 

給DIH requestHandler,但它什麼都沒做。我將它添加到/ update requestHandler中,並且出現錯誤。我不知道應該去哪裏。它只在查詢過程中起作用,還是僅在通過/ update將數據推送到solr時才起作用?

我在哪裏定義文檔的結構?我嘗試了架構中的嵌套字段,DIH配置中的實體以及requestHandlers中的塊連接內容。沒有任何工作。

顯然我錯過了一些東西。

回答

1

DIH不生成嵌套文檔。 Solr支持它們,但DIH還不能生成它們。

DIH中的嵌套實體能夠合併源並能夠基於來自不同源的迭代創建實體。例如。如果外部實體讀取文件名稱的文件並且內部實體從這些文件加載​​內容並且每個文件都獲得它自己的記錄。

您可能想要現在將您的嵌套對象代碼移到帶有SolrJ的客戶端。

+0

是否可以將已格式化的文檔推送到Solr並讓它以相同的方式存儲它? –

+0

您可以將嵌套格式的文檔推送到Solr,但它們需要採用Solr理解的格式:http://heliosearch.org/solr-4-8-features/。您也可能對Solr的SIREn插件感興趣:http://siren.solutions/siren/overview/ –

8

索引嵌套在DIH中的文檔最終從Solr 5.1開始支持。

https://issues.apache.org/jira/browse/SOLR-5147

簡單地增加child=true孩子實體,則Solr的DIH它將自動索引的子文檔。從JIRA拍攝(在上面的鏈路)

實施例:

<document> 
    <entity name='PARENT' query='select * from PARENT'> 
    <field column='id' /> 
    <field column='desc' /> 
    <field column='type_s' /> 
    <entity child='true' name='CHILD' query="select * from CHILD where parent_id='${PARENT.id}'"> 
     <field column='id' /> 
     <field column='desc' /> 
     <field column='type_s' /> 
    </entity> 
</entity> 
</document> 

我還在solr-dataimporthandler-5.3.0.jar反編譯DocBuilder.class,發現這個代碼段: -

if (doc != null) { 
    if (epw.getEntity().isChild()) 
    { 
     childDoc = new DocWrapper(); 
     handleSpecialCommands(arow, childDoc); 
     addFields(epw.getEntity(), childDoc, arow, vr); 
     doc.addChildDocument(childDoc); 
    } 
    else 
    { 
     handleSpecialCommands(arow, doc); 
     addFields(epw.getEntity(), doc, arow, vr); 
    } 
} 

注意到,如果epw.getEntity().isChild()將返回true,如果設置了child="true",則它將創建一個新的DocWrapper並添加爲子文檔,而不是將實體簡單添加爲bunc h新的領域。

相關問題