搜索查询以查找具有多个元素的文档

时间:2018-04-10 19:17:23

标签: xquery marklogic

我在marklogic中有一些XML文档,它们具有结构

tr

我们可以在<abc:doc> <abc:doc-meta> <abc:meetings> <abc:meeting> </abc:meeting> <abc:meeting> </abc:meeting> </abc:meetings> </abc:doc-meta> </abc:doc> 元素下拥有多个<abc:meeting>元素。 我正在尝试编写<abc:meetings>查询以仅获取文档中包含多个cts:search元素的文档。 请指教

2 个答案:

答案 0 :(得分:4)

这很棘手。理想情况下,您希望从索引中搜索搜索以获得最佳性能。不幸的是,MarkLogic没有跟踪其通用索引中的元素计数,并且从范围索引聚合计数可能很麻烦。

总体上最简单的解决方案是在abc:meetings上添加count属性,然后在其上添加范围索引。这意味着您必须更改数据,并且必须使该属性与每次更改保持同步。

您还可以使用abc:meeting搜索cts:element-query()的存在,并附加一个XPath谓词来计算之后的元素数。类似的东西:

cts:search(
  collection(),
  cts:element-query(xs:QName('abc:meeting'), cts:true-query())
)[count(.//abc:meeting) > 1]

如果没有多少文件包含会议,这对您来说可能相当不错,但仍需要提取包含会议的所有文件,因此费用可能很高。

我想到了利用cts:near-query(),但这取决于单词位置,因此取决于会议中实际的令牌数量。如果这总是精确的令牌数量(不太可能我猜),您可以在minimal-distance包含的双cts:element-query()上使用cts:near-query()选项。尽管如此,它可能有助于优化之前的选项。

我现在能想到的最佳性能选项包括添加用户定义的聚合函数。遗憾的是,它意味着编译c ++代码。我碰巧在过去编写过这样的UDF,你应该能够在编译和安装后使用原样。详情请见:

https://github.com/grtjn/doc-count-udf

http://docs.marklogic.com/guide/app-dev/aggregateUDFs

HTH!

答案 1 :(得分:2)

归结为有多少&#34;少数&#34;是。如果它的成千上万或更少,那么grtjn上面提到的cts:search加上一个XPath表达式就可以了。如果还有更多,我将count属性添加到abc:meetings,然后使用预提交触发器(例如,在这些文档的集合上)以确保count属性值保持在同步。您需要一个范围索引才能查询&#34;会议数为2或更高的文档&#34;。

当然,如果您只需查询是否有多个会议,那么只需添加一个&#34;多个&#34;属性为abc:meetings,值为&#34; true&#34;。然后,您不需要范围索引 - 您可以cts:element-attribute-value-query上的abc:meetings和多个=&#34; true&#34;。