【问题标题】:How to restrict Search API for particular collection search in Marklogic?如何限制 Marklogic 中特定集合搜索的 Search API?
【发布时间】:2023-03-05 13:49:01
【问题描述】:
import module namespace search = "http://marklogic.com/appservices/search"
  at "/MarkLogic/appservices/search/search.xqy";

let $options  :=
<options xmlns="http://marklogic.com/appservices/search">
  <constraint>
    <collection>'/mycollection'</collection>
  </constraint>
</options>
let $options-1  :=
<options xmlns="http://marklogic.com/appservices/search">
  <constraint name="collection">
    <collection prefix="/mycollection"/>
  </constraint>
</options>
return
  search:search('Text',$options)

我尝试了这两个选项,但都没有将搜索限制在特定集合 /mycollection

【问题讨论】:

    标签: xquery marklogic-10


    【解决方案1】:

    您已经定义了一个名为collection 的约束并将该约束的前缀配置为/mycollection,但是您尚未将该约束应用于您的搜索。

    约束不会自动应用于您的搜索,它们只是定义可以应用的搜索词和选项。

    如果您查看Collection Constraint Example,他们会注意到:

    如果您在集合约束的定义中包含前缀属性,则集合名称源自与约束值连接的前缀。

    所以,为了让您应用限制集合/mycollection 的约束,我会这样做:

    xquery version "1.0-ml";
    
    import module namespace search = "http://marklogic.com/appservices/search"
        at "/MarkLogic/appservices/search/search.xqy";
        
    let $options  :=
    <options xmlns="http://marklogic.com/appservices/search">
      <constraint name="collection">
        <collection />
      </constraint>
    </options>
    
    return
      search:search("collection:/mycollection " ||'Text', $options)
    

    如果您的所有集合都以斜杠开头,您可以将其设置为前缀,然后只应用不带斜杠的集合的“名称”:

    xquery version "1.0-ml";
    
    import module namespace search = "http://marklogic.com/appservices/search"
        at "/MarkLogic/appservices/search/search.xqy";
        
    let $options  :=
    <options xmlns="http://marklogic.com/appservices/search">
      <constraint name="collection">
        <collection prefix="/"/>
      </constraint>
    </options>
    return
      search:search("collection:mycollection "||'Text', $options)
    

    【讨论】:

    • 这是什么意思?不返回任何文档,返回与您的搜索词匹配但不受集合限制的文档,还是什么?
    • 不限于该集合。