2016-02-05 67 views
0

我試圖導入到Solr 5.1.0和5.2.1中,該數據配置應該生成具有以下結構的文檔:Solr 5.1.0和5.2.1:使用DIH創建親子文檔使用DIH

<parentDoc> 
    <someParentStuff/> 
    <childDoc> 
     <someChildStuff/> 
    </childDoc> 
</parentDoc> 

從我從this question about nested entities in DIH答案的一個理解,我的Solr的版本應該可以用下面的data-config.xml創建上面的結構:

<dataConfig> 
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" 
      url="" 
      user="" 
      password="" 
      batchSize="-1" 
    /> 
    <document name=""> 
     <entity rootEntity="true" name="parent" pk="parent_id" query="select * from parent"> 
      <field column="parent_id" name="parent_id" /> 

      <entity child="true" name="child" query="select * from child where parent_id='${parent.parent_id}'"> 
       <field column="parent_id" name="parent_id" /> 
       <field column="item_status" name="item_status" /> 
      </entity> 
     </entity> 
    </document> 
</dataConfig> 

然而,當我執行full-import,我得到:

<result name="response" numFound="2" start="0"> 
    <doc> 
    <long name="parent_id">477</long> <!-- This is from the child --> 
    <str name="item_status">WS</str> 
    </doc> 
    <doc> 
    <long name="parent_id">477</long> <!-- This is from the parent --> 
    </doc> 
</result> 

我理解的是你應該得到5.1.0之前的非規格化佈局;不過,我預計:

<result name="response" numFound="1" start="0"> 
    <doc> 
     <long name="parent_id">477</long> 
     <doc> 
      <long name="parent_id">477</long> 
      <str name="item_status">WS</str> 
     </doc> 
    </doc> 
</result> 

我需要做什麼來獲得我想要的文檔結構?我誤解了DIH中的嵌套實體應該做什麼?

回答

3

除非有人搖擺不定地告訴我,否則似乎我真的誤解了在Solr 5.1.0+中創建親子文檔。我希望能夠嵌套文件並讓它們返回,但Solr無法實現(至少在這一點上,未來是個謎)。

Solr是一個平面文檔模型。這意味着它不能像我原來的問題那樣模仿親子關係。沒有嵌套。一切都是平坦的和非規範化的。

Solr做了什麼,它將n個子文檔添加到鄰接塊的父項旁邊。例如:

childDoc1 childDoc2 childDoc3 parent

這種結構實際上反映了我「誤」正從Solr中返回的文件:

<result name="response" numFound="2" start="0"> 
    <doc> 
    <long name="parent_id">477</long> <!-- This is from the child --> 
    <str name="item_status">WS</str> 
    </doc> 
    <doc> 
    <long name="parent_id">477</long> <!-- This is from the parent --> 
    </doc> 
</result> 

嵌套文檔支持在DIH可用之後Solr的5.0實際上是對過去人們不得不索引嵌套文檔的舊方式進行附加或完全替換,並且似乎也會爲您同時更新子+父文檔。很方便!

這樣,那麼,你如何表達父子關係時Solr的破壞那該多好,嵌套的文檔模型,你曾計劃?您必須獲得父文檔和子文檔,並在您的應用程序中管理關係。你如何得到父母和孩子?

答案是塊連接。在查詢時

使用塊中的連接,然後在您的應用程序,處理這些文件到您所需的結構。讓我們看看兩個塊連接查詢,因爲它們起初看起來有點怪異。

{!parent which='type:parent'}item_id:5918307

此塊連接查詢說,「給我有與5918307的item_id一個或多個子文件,主文件。「

{!child of='type:parent'} (fieldA:TERM^100.0 OR fieldB:term^100.0 OR fieldC:term OR (fieldD:term^20.0)) AND (instock:true^9999.0)

此塊連接查詢說,‘給我一個或多個子文件的父文件包含單詞‘術語’,並有庫存。’

不要對孩子字段時不搜索做!child查詢。所以,它引用了第一個例子,你就不會在搜索item_id,因爲這會給你一個500錯誤。

你會在這些查詢注意到type場。你必須把它添加到您的架構和數據配置你自己。在該模式中,它看起來像這樣:

<!-- use this field to differentiate between parent and child docs --> 
<field name="type" type="string" indexed="true" stored="false" /> 
data-config.xml

然後,只需像做父如下:

if ('true' = 'true', 'parent', 'parent') as type

而對於孩子做同樣的,不同的是用「孩子」之前你把「父母」放在哪裏。

因此,最終可能最終做出兩個查詢,但似乎並沒有像添加塊連接解析器那樣增加查詢時間。我看到每個查詢可能會多出50或100毫秒。

您通常也可以繞過需要嵌套的文檔,因爲您的連接很聰明。但是,我發現,因爲子文檔現在與父文檔混合在一起,所以每個父文檔都有一個「副本」,並在索引中包含特定的子文檔信息。在這種情況下,您可以從第一個文檔中獲取已知的父字段及其子字段。對於其他文件,您只需抓住子域。

另一種選擇是,當您只想要父文檔並且不希望返回大量其他文檔時,就是使用分組查詢;不過,我不會推薦它。當我在一個返回大量結果的查詢上嘗試它時,我看到查詢時間從10ms到250ms範圍一直到500ms-1s範圍。