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-querycts:element-attribute-valuescts:element-value-query

速度の違いにはいくつかの理由が考えられますが、これが鍵のように思えます。

この操作では、検索基準を満たす一連のノードcts:searchをロードして返す必要があります。関数呼び出しはストリームを返します。concept:ancestorcts:element-attribute-values

一連ノードのロードと送信は、原子値のストリームを提供するよりも時間とメモリを消費します。シーケンス (nodes() であるか原子値であるかに関係なく) は、返される前にメモリに完全に読み込まれますが、原子値のストリームは遅延読み込みであるため、(必ずしも) すべての値を格納することはありません。一気に記憶に。

(シーケンス/ストリームの区別、cts:element-valuesおよびcts:element-attribute-values機能については、MarkLogic コミュニティ ブログに追加されたばかりの投稿から学びました: Result Streams from Range Indexes .)

ただし、2 つのアプローチのどちらを選択するかについての結論は、wst によって既に提案されています。

(XML ではなく) 値のみが必要で、既にインデックスがある場合、cts:element-attribute-valuesクエリは高速になります。

于 2014-01-09T18:20:03.590 に答える