Xquery 搜索查询以查找包含多个元素的文档

Xquery 搜索查询以查找包含多个元素的文档,xquery,marklogic,Xquery,Marklogic,我在marklogic中有一些XML文档,它们具有以下结构 <abc:doc> <abc:doc-meta> <abc:meetings> <abc:meeting> </abc:meeting> <abc:meeting> </abc:meeting> </abc:meetings> </abc:doc

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

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

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

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

您还可以使用cts:element查询搜索abc:meeting的存在,然后附加一个XPath谓词来计算之后的元素数。比如:

cts:search(
  collection(),
  cts:element-query(xs:QName('abc:meeting'), cts:true-query())
)[count(.//abc:meeting) > 1]
如果没有太多文档包含会议,那么这可能对您非常有效,但仍然需要调出所有包含会议的文档,因此可能会很昂贵

我考虑利用cts:near-query,但这取决于单词位置,因此取决于会议中令牌的实际数量。如果这始终是不太可能的令牌的确切数量,那么可以在cts:near查询中包装的双cts:element查询上使用最小距离选项。不过,这可能有助于稍微优化前面的选项

我现在能想到的最具性能的选项是添加一个用户定义的聚合函数。不幸的是编译C++代码。我碰巧在过去写过这样一个UDF,您应该能够在编译和安装之后按原样使用它。详情请参阅:


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

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

您还可以使用cts:element查询搜索abc:meeting的存在,然后附加一个XPath谓词来计算之后的元素数。比如:

cts:search(
  collection(),
  cts:element-query(xs:QName('abc:meeting'), cts:true-query())
)[count(.//abc:meeting) > 1]
如果没有太多文档包含会议,那么这可能对您非常有效,但仍然需要调出所有包含会议的文档,因此可能会很昂贵

我考虑利用cts:near-query,但这取决于单词位置,因此取决于会议中令牌的实际数量。如果这始终是不太可能的令牌的确切数量,那么可以在cts:near查询中包装的双cts:element查询上使用最小距离选项。不过,这可能有助于稍微优化前面的选项

我现在能想到的最具性能的选项是添加一个用户定义的聚合函数。不幸的是编译C++代码。我碰巧在过去写过这样一个UDF,您应该能够在编译和安装之后按原样使用它。详情请参阅:


归根结底要看有多少人是少数人。如果它是数千或更少,那么比grtjn在上面为cts:search加上XPath表达式提供的功能更好。如果更多,我会将count属性添加到abc:meetings,然后使用pre-commit触发器(例如,在这些文档的集合上),以确保count属性值保持同步。您需要一个范围索引,以便能够查询会议次数为2或更多的文档


当然,如果您只需要查询是否有多个会议,那么只需将值为true的multiple属性添加到abc:meetings。然后您不需要范围索引-您可以在abc:meetings和multiple=true上执行cts:element属性值查询

归根结底要看有多少人是少数人。如果它是数千或更少,那么比grtjn在上面为cts:search加上XPath表达式提供的功能更好。如果更多,我会将count属性添加到abc:meetings,然后使用pre-commit触发器(例如,在这些文档的集合上),以确保count属性值保持同步。您需要一个范围索引,以便能够查询会议次数为2或更多的文档


当然,如果您只需要查询是否有多个会议,那么只需将值为true的multiple属性添加到abc:meetings。然后您不需要范围索引-您可以在abc:meetings和multiple=true上执行cts:element属性值查询

我拥有的文档数量似乎在十万个范围内:。我是一个彻头彻尾的ML noob,我希望这能像
SQL查询,相当于计数大于1,分组依据。谢谢你的帮助我拥有的文档数量似乎在十万个范围内:。我是一个彻头彻尾的MLNoob,我希望它能像SQL查询一样简单,相当于count>1,,groupby。谢谢你的帮助