2017-04-04 47 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