如何查询Solr的子文档

时间:2016-07-29 13:03:37

标签: solr

我试图运行一个块连接查询来提取子文档,但我得到一个"父查询产生的文档与父文件过滤器不匹配"错误。 我使用的是Solr 5.5

我的架构如下所示:

<field name="url" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="name" type="text_en" indexed="true" stored="true" required="true" multiValued="false" />
<field name="content_type" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<uniqueKey>url</uniqueKey>

Insert语句如下所示:

{
  "url": "http://www.test.com/index.html",
  "name": "parent product",
  "content_type": "parentDocument",
  "_childDocuments_": [
    {
      "url": "http://www.test.com/index2.html",
      "name": "child product",
      "content_type": "childDocument"
    },
    {
      "url": "http://www.test.com/index3.html",
      "name": "child product 2",
      "content_type": "childDocument"
    }
  ]
}

在控制台中运行标准*:*查询会撤回3个文档,并显示子项属于其父项:

{
  "docs": [
    {
      "url": "http://www.test.com/index2.html",
      "name": "child product",
      "content_type": "childDocument",
      "_root_": "http://www.test.com/index.html"
    },
    {
      "url": "http://www.test.com/index3.html",
      "name": "child product 2",
      "content_type": "childDocument",
      "_root_": "http://www.test.com/index.html"
    },
    {
      "url": "http://www.test.com/index.html",
      "name": "test product",
      "content_type": "parentDocument",
      "_version_": 1541193313504198700,
      "_root_": "http://www.test.com/index.html"
    }
  ]
}

但是,如果我运行q={!child of="content_type:parentDocument"},我会得到父文件,我不会期望这是&#34;孩子的&#34;语句:

{
  "responseHeader": {
    "status": 0,
    "QTime": 0,
    "params": {
      "q": "{!child of=\"content_type:parentDocument\"}",
      "indent": "true",
      "wt": "json"
    }
  },
  "response": {
    "numFound": 1,
    "start": 0,
    "docs": [
      {
        "url": "http://www.test.com/index.html",
        "name": "test product",
        "content_type": "parentDocument",
        "_version_": 1541193313504198656,
        "_root_": "http://www.test.com/index.html"
      }
    ]
  }
}

但如果我添加任何类型的查询,我会收到错误,例如

q={!child of="content_type:parentDocument"}name:product 

甚至

q={!child of="content_type:parentDocument"}name:*

&#34;父查询产生的文档与父项过滤器不匹配,docID = 0&#34;

1 个答案:

答案 0 :(得分:2)

因此,我现在明白它的查询无法返回子文档。它几乎就像一个查询和过滤器。查询即name:*可以匹配不允许的父文档和子文档。我添加了一个额外的过滤器,即+name:product +content_type:parentDocument,以便仅将结果限制为父级。然后我添加{!child of="content_type:parentDocument"}以获得这些父母的孩子,所以我现在有:

{!child of="content_type:parentDocument"}+name:product +content_type:parentDocument

这可以按预期工作。

类似地,反过来是:

{!parent which="content_type:parentDocument"}+name:product +content_type:childDocument

name:product

的孩子的父母