Xquery cts:search和cts:element属性值之间有什么区别?

Xquery cts:search和cts:element属性值之间有什么区别?,xquery,marklogic,cts-search,Xquery,Marklogic,Cts Search,我无法理解cts:search和cts:element属性值之间的差异。 我可以用这两个函数得到相同的结果。 最好的解决办法是什么 cts:search(/t:ancestors-list/t:concept/t:concept-ancestor, cts:element-value-query(xs:QName("t:concept-ancestor"), $concept/id))/@subject 或 ar:concept祖先是元素范围索引和元素属性范围索引 和xml这样的结构 <

我无法理解
cts:search
cts:element属性值之间的差异。
我可以用这两个函数得到相同的结果。
最好的解决办法是什么

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

ar:concept祖先是元素范围索引和元素属性范围索引

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>

4a1f650290103d39863bf7bc22ef18aa
4a1f650290103d39863bf7bc22ef18aa
1c5cd7082ac908c62e9176770ae0fb53
...

谢谢大家!

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


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

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


如果您只需要值(而不是XML)并且已经有了索引,那么
cts:element属性值
查询将更快。

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

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

cts:search
操作必须加载并返回满足搜索条件的
概念:祖先节点的序列。
cts:element属性值
函数调用返回一个值流

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

(我刚刚从MarkLogic社区博客上刚刚添加的一篇文章中了解了序列/流的区别,以及
cts:element-values
cts:element-attribute-values
函数。)

然而,wst已经提出了在两种方法之间进行选择的底线:

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


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

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

cts:search
操作必须加载并向您返回满足搜索条件的
概念:祖先
节点的序列
cts:element属性值
函数调用返回一个值流

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

(我刚刚从MarkLogic社区博客上刚刚添加的一篇文章中了解了序列/流的区别,以及
cts:element-values
cts:element-attribute-values
函数。)

然而,wst已经提出了在两种方法之间进行选择的底线:

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


Facets是一个例子,说明您可能需要一个cts:--values函数——帮助用户浏览的索引中的值列表。我可能错了,但据我理解,如果有索引,cts:element-value-query
将更准确、更快。除此之外,不从数据库检索节点,而是使用I相反,ndex值的性能更高,可扩展性更好。谢谢大家的回答!我不明白为什么第一个示例运行得更快。我必须说第二个示例返回超时错误。我认为索引必须运行得更快,更稳定的面就是一个示例,说明您可能需要一个cts:*-values函数——一个li帮助用户浏览的索引中的st值。我可能错了,但据我所知,
cts:element-value-query
如果有索引将更准确、更快。除此之外,不从数据库检索节点
<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>