我在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
元素的文档。
请指教
答案 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;。