1

嗨,我是 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"
    )

所以请帮我看看是否可以为Above XQuery 形成CTS Query。

4

1 回答 1

2

如果你不能添加路径索引,但整个路径很重要(所以你不能只使用acts: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"
)
于 2018-05-26T00:43:33.320 回答