В чем разница между 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
запрос будет быстрее.