2017-07-22 31 views
0
使用未经过滤的搜索

考虑下面的查询:在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

未过滤的搜索工作和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来测试表达式。

+0

我想你的意思是xdmp:估计($ query)应该给我答案。然而,它仍然给出了错误:表达式是不可测量的 – Yash

+0

@Yash,不,我不是故意复制'let'。变量引用是不可测量的。我更新了答案。 – wst