在marklogic服务器中获取不同的结果集

时间:2012-05-11 09:09:42

标签: xml xquery marklogic

我有这样的XML文档。

  <Authors>
      <Author>
        <name>R.N Tagore</name>
        <book>Gitanjli</book>
      </Author>
      <Author>
        <name>Premchand</name>
        <book>Panch Parameshvar</book>
      </Author>
      <Author>
        <name>H.R Bacchan</name>
        <book>Madhushala</book>
      </Author>
      <Author>
        <name>Premchand</name>
        <book>Gaban</book>
      </Author>
      <Author>
        <name>Premchand</name>
        <book>Nirmala</book>
      </Author>
      <Author>
        <name>Premchand</name>
        <book>Nirmala</book>
      </Author>
  </Authors>

从上面的XML我需要不同的作者姓名列表 为此我可以写一个像

这样的查询
fn:distinct-values(cts:search(fn:doc()//pa:Author/pa:name,cts:and-query(())))

上面的代码将做的是,它将获得作者名称的结果,然后 fn:distinct-values()函数将从该结果集中过滤不同的作者名称。对于当前场景,它将正常工作,因为XML中的数据仅为6,但是当数据非常高时,请说50个lac

cts:search(fn:doc()//pa:Author/pa:name,cts:and-query(()))

上面的查询部分会给出 XDMP-EXPNTREECACHEFULL 异常,因为我们正在尝试在内存中缓存50个lac的元素。
因此,需要您的帮助才能使用 cts:search 搜索:搜索 API获取不同的作者姓名。我不想先得到结果集,然后使用 fn:distinct-values()从该结果集中提取不同的记录。
谢谢,

2 个答案:

答案 0 :(得分:5)

这个问题在MarkLogic Community website首页的Ninja教程中解决,我建议你阅读。

请参阅http://community.marklogic.com/try/ninja/page7

答案 1 :(得分:2)

您可以通过在name上设置范围索引,在大型数据集上快速完成此操作。完成后,使用cts:values()

cts:values(cts:element-reference(xs:QName("name")))

此代码假定您使用索引的默认排序规则。

请注意,当您拥有类似&#34; name&#34;的通用元素名称时,您可能希望使用路径索引更精确。在这种情况下,您可以在Author / name上设置路径范围索引,然后

cts:values(cts:path-reference(xs:QName("Author/name")))

(我假设您使用的是MarkLogic 7+;如果没有,您可以使用cts:element-values()代替cts:values()。)