MarkLogic:将字符串转换为cts:search中的路径表达式

时间:2014-01-30 16:52:48

标签: xml xpath xquery marklogic

如何在 MarkLogic 中创建一个功能,将 XPath 作为字符串,然后将其传递给cts:search函数?

我想做这样的事情:

xquery version "1.0-ml";

declare namespace local = "http://www.local.com/" ;

declare function local:xpath-search($xpath as xs:string, $collection as xs:string, $limit  as xs:string) {
let $valid := cts:valid-index-path($xpath,fn:false())
let $results := cts:search(xdmp:value($xpath), cts:and-query(()) ) [position() < 100]
return 
    if ($valid = false()) then "xpath is invalid"
    else (
        if ($results = '') then "no results were found"
             else $results
        )
    } ;


local:xpath-search('//p', '', '')

但是,我得到了“表达是不可搜索的”错误。

2 个答案:

答案 0 :(得分:2)

使用http://docs.marklogic.com/search:search并使用<searchable-expression>选项提供。

search:search函数已经实现了你想要的功能。在引擎盖下,它调用cts:search并使用xdmp:value提供可搜索表达式。您可以这样做,但search:search已经编写并经过测试。

顺便说一下,使用基于路径的可搜索表达式cts:search对于粗心大意来说是一个陷阱。在大多数情况下,最好使用collection()作为cts:search的第一个参数,匹配整个数据库。然后使用cts:query作为第二个参数,以匹配您感兴趣的文档。

但是//p呢?了解MarkLogic索引片段非常重要,而不是元素。默认情况下,片段是文档。您可以更改:您甚至可以在//p级别进行分段。但在大多数情况下,这是一个坏主意。您可能最好使用cts:search来匹配文档,而使用cts:highlight来查找段落中的匹配项。 search:search函数也支持它。

答案 1 :(得分:1)

卡斯卡韦尔:

您可以尝试将整个cts:search()表示为字符串(将静态部分与路径连接)并使用xdmp:value或xdmp:eval调用它。

希望有帮助,

Erik Hennum