XQuery 到 CTS 查询的转换



嗨,我是 MarkLogic 的新手,在阅读 ML 文档时,我发现执行 CTS 查询的性能优于执行普通 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"
)

因此,请帮助我找出是否可以为上述XQuery形成CTS查询。

如果您不能添加路径索引,但整个路径很重要(因此您不能使用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")))))

根据元素查询文档,您需要启用"单词位置"和"元素单词位置"索引。

处理搜索结果没有任何不同。

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"
)

最新更新