2017-04-04 63 views
0

使用Solr 5.2.1Solr是否支持每個父項的多種類型的嵌套文檔?

父母可以有多種類型的嵌套文檔,或者是父母文檔中的一種類型的子文檔嗎?

因此,例如

gathering: { 
    location: { name: "The park", city: "New York", country: "United States Of America", ...} 
    people: [ 
     { first_name: "John", last_name: "Smith", age: 21, ... }, 
     { first_name: "Jane", last_name: "Doe", age: 19, ...} 
    ] 
} 

是否有可能使用Solr 5.2.x或更新?

回答

1

是的,你可以,對不同類型的兒童文檔沒有限制。這可以通過block-indexingBJQ來實現。爲了檢索兒童文件,可以使用child-transformation

爲了彙報索引表示,讓我提醒你索引塊的概念。的solr/Lucene的不提供本地嵌套結構 - 它們被順序地存儲在文檔平面的方式(一個接一個):

Simple Index Block representation

D0/D5代表從收集簡單的文檔,D1, D2, D3, D4都包括自己的索引塊。 Lucene/Solr提供了將多個文檔索引爲一個塊的方法:IndexWriter#addDocuments()

Solr/Lucene實際上可以用這些塊做什麼 - 它們模仿嵌套結構關係。爲了使這種關係發生,應該引入專門的區分文件。比方說,type - 這類型的文件是:無論是gathering(父),location(兒童,1型)或people(兒童,2型):

Block Join visual representation

因此,在指數掛鉤起來後 - 時間你需要發出水木清華這樣的:

  1. q={!parent which="type:gathering"}first_name:J*(假設你想通過人的first_name匹配)。請注意,您只能在結果集中獲得父文檔。
  2. 爲了檢索兒童文檔,您可以提供child-transformer,正如我所提到的:fl=id,[child parentFilter=type:gathering limit=100]
  3. 我在這裏可以看到的唯一限制 - 您將無法將location模型化爲JSON數組中的單個實體和組people。如果您開發自定義響應編寫器,這可能是可能的,但我認爲這太複雜了,可能不適用於您的業務場景。
+0

你知道是否可以使用SolrJ庫嗎?當我在我的Solr模型中有超過1個孩子(註解@Field(child = true))時,我得到'不能有多於一個Field,並且child = true' – doublemc