在MarkLogic中使用未过滤的搜索

时间:2017-07-22 19:16:50

标签: 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 $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()) 

发出错误:表达式无法搜索

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

1 个答案:

答案 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来测试表达式。