Marklogic 8使用搜索片段对搜索结果进行分组

时间:2016-03-18 16:15:06

标签: marklogic marklogic-8

我有一个用例,其中有父文档和父文档的一些子文档。当我搜索时我想总是返回父文档。让我们说如果搜索结果中有两个具有相同父级的子文档,则需要将结果分组到一个搜索结果,其中包含从子文档中传输的片段。此外,我想应用分页,但分页应该在转换后的搜索结果上。这可能吗?父和子之间的关系是子文档中的属性<parent-document-location>

  

父文档属性

<?xml version="1.0" encoding="UTF-8"?>
<prop:properties xmlns:prop="http://marklogic.com/xdmp/property">
  <id xmlns="http://ir.abbivenet.com/content-repo/metadata">1e900d1a7210350c0b68973fb0d6dc96f83e161a</id>
  <cpf:processing-status xmlns:cpf="http://marklogic.com/cpf">done</cpf:processing-status>
  <cpf:property-hash xmlns:cpf="http://marklogic.com/cpf">34d0a49cf8835387f6bd213a31732ad4</cpf:property-hash>
  <cpf:last-updated xmlns:cpf="http://marklogic.com/cpf">2016-03-15T21:18:20.521372Z</cpf:last-updated>
  <cpf:state xmlns:cpf="http://marklogic.com/cpf">http://marklogic.com/states/done</cpf:state>
  <cpf:self xmlns:cpf="http://marklogic.com/cpf">/documents/BioEln/1e900d1a7210350c0b68973fb0d6dc96f83e161a.xml</cpf:self>
  <prop:last-modified>2016-03-15T21:50:38Z</prop:last-modified>
</prop:properties>
  

儿童文件1

<?xml  version="1.0" encoding="UTF-8"?>
<prop:properties xmlns:prop="http://marklogic.com/xdmp/property">
<document-parent-location xmlns="http://ir.abbivenet.com/content-repo/metadata">/documents/BioEln/1e900d1a7210350c0b68973fb0d6dc96f83e161a.xml</document-parent-location>
<context xmlns="http://ir.abbivenet.com/content-repo/metadata">BioEln</context>
<id xmlns="http://ir.abbivenet.com/content-repo/metadata">1e900d1a7210350c0b68973fb0d6dc96f83e161a</id>
<prop:last-modified>2016-03-15T21:50:34Z</prop:last-modified>
</prop:properties>
  

儿童文件2

<?xml  version="1.0" encoding="UTF-8"?>
<prop:properties xmlns:prop="http://marklogic.com/xdmp/property">
<document-parent-location xmlns="http://ir.abbivenet.com/content-repo/metadata">/documents/BioEln/1e900d1a7210350c0b68973fb0d6dc96f83e161a.xml</document-parent-location>
<context xmlns="http://ir.abbivenet.com/content-repo/metadata">BioEln</context>
<id xmlns="http://ir.abbivenet.com/content-repo/metadata">1e900d1a7210350c0b68973fb0d6dc96f83e161a</id>
<prop:last-modified>2016-03-15T21:50:34Z</prop:last-modified>
</prop:properties>

2 个答案:

答案 0 :(得分:3)

如果要搜索子文档并仅返回每个父文档的结果/片段,那么理想的解决方案可能是在摄取过程中将父文档和子文档合并为一个文档。通过这种方式建模数据,您可以编写查询来搜索子文档数据,然后您可以在代码段生成期间转换父文档结果。

将这些数据保存在单独文档中的任何解决方案都需要&#34;加入&#34;运行时的数据,每页选择更多结果,以便于父文档的重复数据删除。与非正规化的&#34;相比,每个都会产生性能损失。单个文档,它可能会使实现更复杂。

答案 1 :(得分:2)

  • 如果parent-document-location是父级中存在的id 文档,然后使用范围索引并创建一个鸟枪查询。
  • 如果父文档位置是uri,则添加索引并使用 cts-values,并将uris传输到cts:document-query
  • 否则,另一种非侵入性的方式是与某些魔法有关 在文档组上使用集合和一些魔法 cts的组合:集合管道输入cts:collection-query。

对上述所有内容进行一些实际操作(索引或集合),但所有这些选项都使用范围索引或词典。我建议的所有这些都不需要重复数据删除(因为我们会确保通过查询以某种方式隔离父文档)

如果您对上述任何内容感兴趣,请发布一些示例文档和uris,我们可以从那里开始改进答案以更具体地满足您的需求