5

我正在尝试使用子文档创建 solr 文档。我正在使用 solr 8.2.0 为了遵守https://lucene.apache.org/solr/guide/8_0/indexing-nested-documents.html#indexing-nested-documents中的说明,我将以下内容添加到架构.xml

<field name="_root_" type="string" indexed="true" stored="false"/>
<fieldType name="nest_path" class="solr.NestPathField" />
<field name="_nest_path_" type="nest_path" />
<field name="_nest_parent_" type="string" indexed="true" stored="true"/>

为了创建一个测试文档,我使用了以下 PHP 代码:

$solrClient = ...
$solrInputDocument = new SolrInputDocument();
$solrInputDocument->addField('id', 'yirmi1', 1);
$solrInputDocument->addField('test_s', 'this is a parent test', 1);
$childDoc = new SolrInputDocument();
$childDoc->addField('id', 'yirmi2', 1);
$childDoc->addField('test_s', 'this is a child test', 1);
$solrInputDocument->addChildDocument($childDoc);
$solrUpdateResponse = $solrClient->addDocument($solrInputDocument);
$solrClient->commit();

当我查询fq=id: "yirmi1"orfq=id: "yirmi2"时,会出现记录,但没有迹象表明存在父文档或子文档。此外,当查询字段_nest_parent__nest_path__root_时,即使我将它们指定为查询字段,也不会出现。

我还需要设置什么才能正确创建嵌套文档。

4

3 回答 3

1

显然是“匿名”或“未标记”的子文档,_nest_path_不能很好地混合在一起。

我认为你有两个选择:

一个)

如果要使用 addChildDocument,则需要从架构中删除_nest_path__nest_parent_字段。

二)

像设置任何其他字段一样设置父子关系:

$solrInputDocument->addField('child', $childDoc);
于 2020-03-14T19:44:19.180 回答
0

你加了fl=*,[child]吗?那应该返回childDocuments

我承认我是 SOLR 的新手,而且我还没有 100% 成功。:(

于 2020-01-03T22:13:15.710 回答
0

对我来说(Solr 8.5.1,通过数据导入处理程序添加的文档以及来自 PostgreSQL 的嵌套实体)_childDocuments_只有在 schema.xml 不包含_nest_path_字段和字段类型时才会包含在响应中。

_nest_parent_也可以从模式中删除,因为据我观察它没有填充。

_root_架构中需要一个字段:

<field name="_root_" type="string" indexed="true" stored="true" docValues="false" /> 

通过在文档中添加某种类型的信息,效果最好,例如entitytype以下示例:

...
$solrInputDocument = new SolrInputDocument();
$solrInputDocument->addField('id', 'yirmi1', 1);
$solrInputDocument->addField('entitytype', 'parent', 1);
$solrInputDocument->addField('test_s', 'this is a parent test', 1);
$childDoc = new SolrInputDocument();
$childDoc->addField('id', 'yirmi2', 1);
$childDoc->addField('entitytype', 'child', 1);
$childDoc->addField('test_s', 'this is a child test', 1);
$solrInputDocument->addChildDocument($childDoc);
...

然后使用以下参数进行查询:

q=entitytype:parent
fl=*,[child parentFilter=entitytype:parent]
于 2020-06-25T08:07:17.377 回答