gpt4 book ai didi

marklogic - 仅返回 cts :reverse-query 中的 URI

转载 作者:行者123 更新时间:2023-12-02 21:02:22 27 4
gpt4 key购买 nike

更新:请参阅结尾 - 一个示例,显示 cts:uris 不是有效的方法,因为它不会在所有情况下返回正确的结果。

我有一个用例,在 MarkLogic 中,有时在包含 cts:reverse-query 的搜索结果中会有数十万个匹配项。这样,我想要返回的只是与结果匹配的文档的 URI,以便我可以缓存它们并稍后通过 Corb2 处理它们。

示例代码:

xquery version "1.0-ml";


let $_ := xdmp:invoke-function(function(){
for $val in ("foo", "bar", "baz")
let $query := <query>{cts:element-word-query(xs:QName("what"), ($val))}</query>
return (
xdmp:document-insert("/test/reverse-" || $val ||".xml", $query, (), ("test-reverse")),
xdmp:commit()
)

},<options xmlns="xdmp:eval">
<transaction-mode>update</transaction-mode>
</options>
)


return for $result in cts:search(collection("test-reverse"), cts:reverse-query(<what>baz</what>))
return xdmp:node-uri($result)

这将返回:

/test/reverse-baz.xml

这是预期的。

但是,我感觉好像我在这里做了太多处理,因为我已经有来自 cts:search() 的文档。但话又说回来,由于机器学习是懒惰的,也许即使是现在,我真的只有一个引用,因为我没有访问文档中的任何内容..?

我想要的是使用 cts:uris() 来获得与上面相同的结果。但是,您不能将 cts:reverse-query 与 cts:uris() 一起使用

是的,我知道反向查询不一定需要作为文档存在于数据库中才能使用它(cts:contains 示例),因此在某些用例中,URI 甚至不存在。但对我来说他们确实如此。

此外,我很确定我可以使用 xdmp:plan() 通过拉出 来生成 cts:uris() 所需的查询Final-plan 并将命名空间重写为 cts,但我不确定这是否更快。

有了上述内容,下面的 (2) 个问题:

  1. 对于了解 MarkLogic 内部结构的人,您是否认为 cts-search->for 循环 ->sdmo:node-uri() 高效且影响不大(换句话说,我是否可以在不扩展文档的情况下实现这一点?进入扩展树缓存?)
  2. 如果没有,您能想出一种比我上面更快的方式来模仿 cts:uris 的更有效的方法吗?

为什么不使用 cts:uris() - 因为我没有找到匹配项,所以我取回了所有内容:

xquery version "1.0-ml";


let $_ := xdmp:invoke-function(function(){
for $val in ("foo", "bar", "baz")
let $query := <query>{cts:element-word-query(xs:QName("what"), ($val))}</query>
return (
xdmp:document-insert("/test/reverse-" || $val ||".xml", $query, (), ("test-reverse")),
xdmp:commit()
)

},<options xmlns="xdmp:eval">
<transaction-mode>update</transaction-mode>
</options>
)


return cts:uris((),(),
cts:and-query((
cts:collection-query("test-reverse"),
cts:reverse-query((<foo/>))
)))

返回:
/test/reverse-bar.xml
/test/reverse-baz.xml
/test/reverse-foo.xml

最终示例显示结果差异(验证 cts:uris 不起作用):

xquery version "1.0-ml";


let $_ := xdmp:invoke-function(function(){
for $val in ("foo", "bar", "baz")
let $query := <query>{cts:element-word-query(xs:QName("what"), ($val))}</query>
return (
xdmp:document-insert("/test/reverse-" || $val ||".xml", $query, (), ("test-reverse")),
xdmp:commit()
)

},<options xmlns="xdmp:eval">
<transaction-mode>update</transaction-mode>
</options>
)

let $uris-from-cts-uris := cts:uris((),(),
cts:and-query((
cts:collection-query("test-reverse"),
cts:reverse-query(<foo/>)
)))

let $uris-from-search := for $result in cts:search(collection("test-reverse"), cts:reverse-query(<foo/>))
return xdmp:node-uri($result)

return
(
$uris-from-cts-uris,
"xxxxxxxxxxxxxxxxx",
$uris-from-search

)

结果如下:

/test/reverse-bar.xml
/test/reverse-baz.xml
/test/reverse-foo.xml
xxxxxxxxxxxxxxxxxx

内容如下:cts:uris 只给了我整个集合,而它本不应该给我任何东西,而 cts:search 给出了正确的响应。

最佳答案

为什么不能将 cts:reverse-query() 与 cts:uris() 一起使用?

试试这个:

cts:uris((),(),
cts:and-query((
cts:collection-query("test-reverse"),
cts:reverse-query(<what>baz</what>)
)))

关于marklogic - 仅返回 cts :reverse-query 中的 URI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37656860/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com