在 MarkLogic 中使用未过滤的搜索

Using unfiltered search in MarkLogic

考虑以下查询:

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

给了一个 error:Expression 是不可搜索的

我相信这意味着无法使用索引搜索查询。如果是这样,为什么未经过滤的方法工作得很好?

未过滤的搜索有效而 xdmp:estimate 表达式无效,因为它们没有使用相同的查询和表达式。您传递的查询 cts:search 是完全可搜索的,因此当您对其调用 xdmp:estimate 时它将起作用:

xdmp:estimate(cts:search(fn:doc(), $range_query, "unfiltered")

xdmp:estimate 需要一个 "partially searchable" XPath 表达式,which has a specific definition according to MarkLogic. 关于使表达式完全或部分或不可搜索的原因有一些微妙的细节,并且可能是最有指导意义的方法关于它是使用 xdmp:query-trace 来测试表达式。