您好我是MarkLogic的新手,在阅读ML文档时,我发现执行CTS查询的性能优于执行Plain XQuery。
要求:我需要将XQuery转换为CTS查询以执行XPath及其值的搜索,我也不想为XPath创建路径索引,因为我正在获取Xpath动态。
for $document in collection()[/tXML/Message/TEST/TEST1/TESTID="10"]
return
(
if(fn:not(fn:empty($document/tXML/Message/TEST/TESTID))) then $document/tXML/Message/TEST/TESTID else "NULL",
if(fn:not(fn:empty($document/tXML/Message/TEST/TESTType))) then $document/tXML/Message/TEST/TESTType else "NULL",
if(fn:not(fn:empty($document/tXML/Message/TEST/TESTStatus))) then $document/tXML/Message/TEST/TESTStatus else "NULL"
)
所以请帮助我找出是否可以形成CTS Query for Above XQuery。
答案 0 :(得分:2)
如果您无法添加路径索引,但整个路径非常重要(因此您无法使用 a cts:element-value-query(xs:QName('TESTID'), "10")
),那么您可以使用像这样的元素查询堆栈
let $query :=
cts:element-query(xs:QName('tXML'),
cts:element-query(xs:QName('Message'),
cts:element-query(xs:QName('TEST'),
cts:element-query(xs:QName('TEST1'),
cts:element-value-query(xs:QName('TESTID'), "10")))))
根据element-query docs,您希望拥有"字位置"和"元素字位置"索引已启用。
处理搜索结果不会有任何不同。
for $document in cts:search(collection(), $query)
return (
if(fn:not(fn:empty($document/tXML/Message/TEST/TESTID))) then $document/tXML/Message/TEST/TESTID else "NULL",
if(fn:not(fn:empty($document/tXML/Message/TEST/TESTType))) then $document/tXML/Message/TEST/TESTType else "NULL",
if(fn:not(fn:empty($document/tXML/Message/TEST/TESTStatus))) then $document/tXML/Message/TEST/TESTStatus else "NULL"
)