【问题标题】:What is the difference between cts:search and cts:element-attribute-values?cts:search 和 cts:element-attribute-values 有什么区别?
【发布时间】:2013-12-29 17:23:27
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: xquery marklogic cts-search


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • Facets 是您可能需要 cts:*-values 函数之一的示例 - 来自索引的值列表,可帮助您的用户浏览。
      • 我可能错了,但据我了解,cts:element-value-query 如果有索引会更准确、更快。除此之外,不从数据库中检索节点,而是使用索引值来提高性能,并且可以更好地扩展......
      • 谢谢大家的回答!我不明白为什么第一个例子工作得更快。我不得不说第二个返回超时错误。我认为索引必须工作得更快、更稳定
      猜你喜欢
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-12
      • 1970-01-01
      相关资源
      最近更新 更多