在 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
来测试表达式。
考虑以下查询:
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
来测试表达式。