【问题标题】:How can you retrieve a full nested document in Solr?如何在 Solr 中检索完整的嵌套文档?
【发布时间】:2016-08-03 22:25:57
【问题描述】:

在我的 Solr 4.10.3 实例中,我想索引具有嵌套结构的 JSON。

例子:

{
  "id": "myDoc",
  "title": "myTitle"
  "nestedDoc": {
    "name": "test name"
    "nestedAttribute": {
      "attr1": "attr1Val"
    }
  }
}

我可以通过管理界面正确存储它:

/solr/#/mySchema/documents

而且我还可以搜索和检索文档。

我面临的问题是,当我从 Solr 搜索中获取响应文档时,我看不到嵌套属性。我只看到:

{
  "id": "myDoc",
  "title": "myTitle"
}
有没有办法在返回的文档中包含所有嵌套字段?

我尝试使用:“fl=[child parentFilter=title:myTitle]”,但它不起作用(ChildDocTransformerFactory 来自:https://cwiki.apache.org/confluence/display/solr/Transforming+Result+Documents)。这是正确的方法还是有其他方法?

我正在使用:Solr 4.10.3!!!!!!

【问题讨论】:

  • 任何 localParams 都应该使用 { } 作为它们的语法,而不是 [],它们通常放在 query/fq 部分,而不是字段列表中。我不熟悉父母/孩子的关系,所以我不能说这是否是你的问题。
  • @MatsLindh:我试图使用来自 cwiki.apache.org/confluence/display/solr/… 的 ChildDocTransformerFactory。通过简单的查询,我只能看到父结构(没有嵌套的子结构)。有什么想法吗?

标签: solr nested documents


【解决方案1】:

要返回所有嵌套结构,您确实需要使用 ChildDocTransformerFactor。但是,您首先需要正确索引您的文档。

如果您只是按原样传递结构,Solr 会将它们作为单独的文档进行索引,并且不会知道它们实际上是连接的。如果您希望能够正确查询嵌套文档,则必须按照this post 中的描述预处理您的数据结构,或者尝试使用(根据需要修改)预处理script。不幸的是,包括最新的 Solr 6.0 在内,在索引和返回嵌套文档结构方面没有好的和流畅的解决方案,所以一切都是通过“变通办法”完成的。

特别是在您的情况下,您需要将文档结构转换为:

{
  "type": "parentDoc", 
  "id": "myDoc",
  "title": "myTitle"
  "_childDocuments_": [ 
  {
     "type": "nestedDoc",
     "name": "test name",
     "_childDocuments_" :[
     { 
      "type": "nestedAttribute"
       "attr1": "attr1Val"
     }]
   }]    
} 

然后,下面的 ChildDocTransformerFactor 查询将返回所有子文档(顺便说一句,虽然它说它从 Solr 4.9 开始可用,但我实际上只在 Solr 5.3 中看到它......所以你需要测试):

q=title:myTitle&fl=*,[child parentFilter=type:parentDoc limit=50]

注意,虽然它返回所有嵌套文档,但返回的文档结构将是 flattend(唉!),即,您将得到:

{
  "type": "parentDoc", 
  "id": "myDoc",
  "title": "myTitle"
  "_childDocuments_": [ 
  {
     "type": "nestedDoc",
     "name": "test name"
  },   
  { 
      "type": "nestedAttribute"
       "attr1": "attr1Val"
  }]    
} 

可能不是您所期望的,但是...这是 Solr 的不幸行为,将在最近的未来版本中修复。

【讨论】:

  • 关于结果不是扁平化的版本的任何消息?
  • @DavidVdd 由于引入了 Solr 6 图结构,似乎它们将取代 BlockJoin 功能。换句话说,如果扁平化问题已经/将要解决,它将沿着图形线而不是沿着 BlockJoin 线完成
【解决方案2】:

你可以放 q={!parent which=} 在 fl 字段中:"fl=*,[child parentFilter=title:myTitle]。

它会给你标题的所有父字段和子字段:mytitle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 2016-01-07
    • 2015-09-01
    相关资源
    最近更新 更多