Solr是否支持每个父级的多种嵌套文档?

时间:2017-04-04 18:48:04

标签: solr nested

使用Solr 5.2.1

父母可以拥有多种类型的嵌套文档,还是每个父文档都有一种子文档?

所以例如

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 个答案:

答案 0 :(得分:1)

是的,您可以,对不同类型的儿童文档没有限制。这可以通过block-indexingBJQ来实现。为了检索子文档,可以使用child-transformation

为了汇报索引表示,让我提醒你index-block的概念。 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-transformerfl=id,[child parentFilter=type:gathering limit=100]
  3. 我在这里可以看到的唯一限制 - 您无法将location建模为单实体,将people组建模为JSON数组。如果您要开发自定义响应编写器,这可能是可能的,但我认为这太复杂,可能不适合您的业务场景。