В чем разница между cts:search и cts:element-attribute-values?

Я не могу понять почтение между 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>

Спасибо!

2 ответа

cts:element-attribute-values требует, чтобы индекс диапазона атрибута элемента был настроен для запрашиваемых значений, и он возвращает только атомарный тип (xs:anyAtomicType*). cts:search возвращает узлы документа, и индексы не требуются для cts:element-value-query,

Если вам нужны только значения (не XML) и у вас уже есть индекс, тогда cts:element-attribute-values запрос будет быстрее.

Принципиальное отличие состоит в том, что cts:search возвращает последовательность узлов, внутри которых cts:element-value-query удовлетворен, в то время как cts:element-attribute-valuesФункция возвращает поток фактических значений атрибутов, которые определены в вашем индексе (где значения дополнительно ограничены cts:element-value-query что вы передаете в функцию).

Я могу подумать о нескольких возможных причинах разницы в скорости, но это мне кажется ключевым:

cts:search операция должна загрузить и вернуть вам последовательность concept:ancestor узлы, которые удовлетворяют критериям поиска. cts:element-attribute-values Вызов функции возвращает поток значений.

Загрузка и отправка последовательности узлов будет более затратной по времени и памяти, чем предоставление вам потока атомарных значений. Последовательность (независимо от того, является ли она узлами () или атомарными значениями) будет полностью загружена в память, прежде чем она будет возвращена вам, в то время как поток атомарных значений загружается лениво, так что она (не обязательно) хранит все значения в памяти сразу.

(Я только что узнал о различии последовательности / потока и cts:element-values а также cts:element-attribute-valuesфункции из только что добавленного поста в блоге сообщества MarkLogic: потоки результатов из индексов диапазона.)

Суть, однако, в выборе между двумя подходами уже была предложена wst:

Если вам нужны только значения (не XML) и у вас уже есть индекс, тогда cts:element-attribute-values запрос будет быстрее.

Другие вопросы по тегам