0

我无法理解 和 之间cts:search的尊重cts:element-attribute-values。我可以用这两个函数得到相同的结果。最好的解决办法是什么?

cts:search(/t:ancestors-list/t:concept/t:concept-ancestor, cts:element-value-query(xs:QName("t:concept-ancestor"), $concept/id))/@subject

或者

cts:element-attribute-values(
  xs:QName("t:concept-ancestor"),
  xs:QName("subject"),
  (),
  ("collation=http://marklogic.com/collation/codepoint"),
  cts:element-value-query(
    xs:QName("t:concept-ancestor"),
    $concept/id
  )
)

ar:concept-ancestor是元素范围索引和元素属性范围索引。

和这样的xml结构

<t:ancestors-list xmlns:ar="http://test.com">
    <t:concept subject="http://test.com/concept#1c5cd7082ac908c62e9176770ae0fb53">
        <t:concept-ancestor subject="http://test.com/concept#1c5cd7082ac908c62e9176770ae0fb53">4a1f650290103d39863bf7bc22ef18aa</t:concept-ancestor>
    </t:concept>
    <t:concept subject="http://test.com/concept#05b707457f79f42c93bf778915e4a589">
        <t:concept-ancestor subject="http://test.com/concept#05b707457f79f42c93bf778915e4a589">4a1f650290103d39863bf7bc22ef18aa</t:concept-ancestor>
        <t:concept-ancestor subject="http://test.com/concept#05b707457f79f42c93bf778915e4a589">1c5cd7082ac908c62e9176770ae0fb53</t:concept-ancestor>
    </t:concept>
    ...
</t:ancestors-list>

谢谢!

4

2 回答 2

3

cts:element-attribute-values需要在您查询的值上配置元素属性范围索引,并且它只返回一个原子类型 ( xs:anyAtomicType*)。cts:search返回文档节点,并且不需要索引cts:element-value-query

如果您只需要这些值(不是 XML)并且您已经有一个索引,那么cts:element-attribute-values查询会更快。

于 2013-12-11T16:25:41.260 回答
2

根本区别在于cts:search返回满足 的节点序列cts:element-value-query,而cts:element-attribute-values函数返回在索引中定义的实际属性值的流(其中值进一步受到cts:element-value-query传递给函数的限制)。

我可以想到速度差异的几个可能原因,但这在我看来是关键:

cts:search操作必须加载并返回满足搜索条件的节点序列。函数调用返回一个concept:ancestorcts:element-attribute-values

加载和发送一系列节点将比给你一个原子值流更耗费时间内存。一个序列(无论是 nodes() 还是原子值)将在返回给您之前完全加载到内存中,而原子值流是延迟加载的,因此它不会(必然)存储所有值一下子在记忆中。

(我刚刚从 MarkLogic 社区博客上刚刚添加的帖子中了解了序列/流的区别以及cts:element-values和函数:范围索引的结果流。)cts:element-attribute-values

不过,wst 已经建议了在这两种方法之间进行选择的底线:

如果您只需要这些值(不是 XML)并且您已经有一个索引,那么cts:element-attribute-values查询会更快。

于 2014-01-09T18:20:03.590 回答