MarkLogic:使用 xdmp:estimate 和编码标准

MarkLogic: Using xdmp:estimate and coding standards

我最初写了查询:

cts:search(fn:doc(),cts:element-range-query(xs:QName("ts:week"), ">=", xs:date("2009-05-01")),"unfiltered")

我修改为如下,看起来更美观:

let $range_query := cts:element-range-query(xs:QName("ts:week"), ">=", xs:date("2009-05-01"))
let $query := cts:search(fn:doc(), $range_query, "unfiltered")
return $query

我得到了与预期相同的结果。

现在,为了确认我的 "unfiltered" 方法,我 运行 fn:count 与 xdmp:estimate 检查。

xdmp:estimate(cts:search(fn:doc(),cts:element-range-query(xs:QName("ts:week"), ">=", xs:date("2009-05-01")))

上面的查询 运行 很好并且 return 得到了预期的结果。

但是,

let $range_query := cts:element-range-query(xs:QName("ts:week"), ">=", xs:date("2009-05-01"))
let $query := cts:search(fn:doc(), $range_query)
return xdmp:estimate($query)

给我一个错误:无法搜索表达式。

1) 我使用 let 和 return 的方法是在 MarkLogic 中编写代码的推荐方式吗?

2) 使用 let 和 return 方法无法搜索表达式的原因是什么?

xdmp:estimate 函数采用表达式进行计算。您不能传递变量。在你的例子中,第三行的 $query 是一个结果序列,你不能估计一个序列。

事实上,您的 $query 应该真正称为 $results,因为它没有保存查询,而是保存搜索的执行结果。

xdmp:estimate想成是"Hey if I ran this expression how many results do the indexes think I'd get?"