cts:search和cts:element-attribute-values有什么区别?

时间:2013-12-11 16:10:56

标签: xquery marklogic cts-search

我无法理解cts:searchcts: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>

谢谢!

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

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

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

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

(我刚刚了解了序列/流的区别,以及来自MarkLogic社区博客上刚刚添加的帖子的cts:element-valuescts:element-attribute-values函数:Result Streams from Range Indexes

但是,在两种方法之间进行选择的底线已经由wst提出:

  

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