考虑以下问题:
xquery version "1.0-ml";
declare namespace ts = "http://marklogic.com/MLU/top-songs";
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 $query/ts:top-song/ts:title/text()
(不是:已启用星期范围索引)
我相信上面的查询只能根据索引给出结果,并且根据这个假设我做了以下更改:
let $query := cts:search(fn:doc(), $range_query, "unfiltered")
我得到了相同的结果。
然而,
fn:count($query/ts:top-song/ts:title/text()) gave a result of 8
和
xdmp:estimate($query/ts:top-song/ts:title/text())
发出错误:表达式无法搜索
我认为这意味着无法使用索引搜索查询。如果是这样,为什么未经过滤的方法工作得很好?
答案 0 :(得分:1)
未经过滤的搜索有效且xdmp:estimate
表达式不起作用,因为他们没有使用相同的查询和表达式。您通过cts:search
的查询是完全可搜索的,因此当您在其上调用xdmp:estimate
时它将起作用:
xdmp:estimate(cts:search(fn:doc(), $range_query, "unfiltered")
xdmp:estimate
需要"可部分搜索" XPath表达式,which has a specific definition according to MarkLogic.关于是什么使表达式完全或部分或不可搜索,有一些微妙的细节,可能最有启发性的方法是使用xdmp:query-trace
来测试表达式。