Indexing 在MarkLogic中使用未过滤搜索

Indexing 在MarkLogic中使用未过滤搜索,indexing,marklogic,Indexing,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 $q

考虑以下查询:

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
表达式不能工作,因为它们使用的查询和表达式不同。您传递的查询是完全可搜索的,因此当您对其调用
xdmp:estimate
时,它将起作用:

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

xdmp:estimate
需要一个“部分可搜索”的XPath表达式,关于表达式完全或部分可搜索或不可搜索的原因,有一些微妙的细节,最有启发性的方法可能是使用
xdmp:query trace
来测试表达式。

我想你的意思是xdmp:estimate($query)你应该给我答案。然而,它仍然给出了一个错误:表达式是unsearchable@Yash,不,我不是有意复制
let
。变量引用是不可搜索的。我更新了答案。将表达式分配给变量会导致它(变量表达式,而不是搜索表达式)不可搜索。这是一个非常不直观的概念,以至于我头十几次碰到这个问题时就秃顶了。可能自从我上次秃顶以来,情况已经改变了。
xdmp:estimate(cts:search(fn:doc(), $range_query, "unfiltered")