Solr使用ChildDocTransformerFactory查询嵌套文档,获取"父查询生成与父项过滤器不匹配的文档"

时间:2017-01-31 23:27:42

标签: solr nested-documents

一些背景知识:

  • 涉及的数据是目录数据,按顺序有三个嵌套对象:Products,Items和Skus。我们在每条记录上都有一个docType字段作为区分符。
  • " id"数据类型中的字段在数据类型中是唯一的,但不是跨数据类型。我们添加了一个" uuid"我们程序中生成Solr导入文件的字段,该文件的前缀是docType的第一个字母,如P12345。这使得uuid字段是唯一的,我们将它作为schema.xml中的uniqueKey。
  • 我们正在尝试检索父Product和所有子文档。因此,我们使用ChildDocTransformerFactory([child ...])来检索子项以及父项。我们还没有解决在结果中将SKU中的项目作为嵌套文档获取的问题,我们必须在某些时候弄清楚这一点,但是现在我们将它们弄平了
  • 我们正在为此构建概念证明。这是所有新工作,所以我们可以自由改变。
  • 这是Solr 6.0.0,我们正在以JSON格式导入,如果这很重要

我们的数据看起来像这样(为了简单起见,我删除了一些字段):

{
  "id": 739063,
  "docType": "Product",
  "uuid": "P739063",
  "_childDocuments_": [
    {
      "id": 1537378,
      "price": 25.45,
      "color": "Blush",
      "docType": "Item",
      "productId": 739063,
      "uuid": "I1537378",
      "_childDocuments_": [
        {
          "id": 12799578,
          "size": "10",
          "width": "W",
          "docType": "Sku",
          "itemId": 1537378,
          "uuid": "S12799578"
        }
      ]
    }
}

获取嵌套在其中的所有产品及其子项的查询是 q = docType:Product& fl = title,id,docType,[child parentFilter = docType:Product] 。当我运行该查询时,一切都很好,它返回前10行。但是,如果我通过添加来获取更多行,例如& rows = 500 ,我们会收到错误父查询生成文档,该文档与父级过滤器不匹配,docID = XXX

当我们第一次看到这个错误时,我们发现我们的id字段在文档类型中并不是唯一的,所以我们添加了如上所述的uuid字段,即。我们还在schema.xml文件中添加了 ,擦除了核心,重新创建了它,并重新启动了Solr,以确保它生效。我们进行了双重检查,并确保uuid字段是唯一的。

在我发现的该错误的所有搜索结果中,OP没有可以区分不同文档类型的字段,但正如您所看到的那样。由于查询和parentFilter都在搜索 docType:Product ,我不知道如何除了父母之外还可以返回任何内容。我们还尝试添加childFilter = docType:Item和childFilter = docType:Sku但是没有帮助。我还尝试使用title:*作为查询和parentFilter,因为只有产品有标题。

我们还有什么可以尝试的吗?

对此有何解释?

即使在schema.xml中指定了uuid,它是否可能不使用uuid作为唯一标识符,这是否会导致这种情况?

感谢。

1 个答案:

答案 0 :(得分:1)

事实证明我们甚至没有使用schema.xml,因为solrconfig.xml是为托管架构配置的。糟糕。

大部分文档都假设您使用的是无模式,甚至没有详细介绍,所以我错过了。