Marklogic REST API搜索最新文档版本

Marklogic REST API搜索最新文档版本,rest,marklogic,Rest,Marklogic,我们需要使用MarkLogic的RESTAPI将MarkLogic搜索限制为托管文档的最新版本。我们使用的是MarkLogic6 使用straight xquery,您可以使用dls:documents-query()作为额外的查询选项(请参阅 ) 但是RESTAPI需要XML,而不是任意的xquery。您可以很容易地将普通cts查询转换为XML(在QConsole中执行{cts:word query(“hello world”)}) 如果我尝试使用dls:documents-query() &

我们需要使用MarkLogic的RESTAPI将MarkLogic搜索限制为托管文档的最新版本。我们使用的是MarkLogic6

使用straight xquery,您可以使用
dls:documents-query()
作为额外的查询选项(请参阅 )

但是RESTAPI需要XML,而不是任意的xquery。您可以很容易地将普通cts查询转换为XML(在QConsole中执行
{cts:word query(“hello world”)}

如果我尝试使用
dls:documents-query()

<cts:properties-query xmlns:cts="http://marklogic.com/cts">
    <cts:registered-query>
        <cts:id>17524193535823153377</cts:id>
    </cts:registered-query>
</cts:properties-query>

17524193535823153377
除了不完全透明之外。。。这个号码有多安全?我们需要将它放在查询选项中,这样我们就不能在每次需要时重新生成它。我在这里看过两个不同的安装,数量是一样的,但是它保证是一样的吗?它会改变吗?例如,在MarkLogic升级上

另外,假设号码是安全的,那么注册的查询是否总是存在?文档中说,系统可能会在不同的时间清除已注册的查询,但它是指用户定义的已注册查询,我不确定其中有多少适用于内部查询


这是正确的方法吗?如果我们不能做到这一点,我们可以设置集合并以这种方式限制搜索,但如果可能的话,我们宁愿使用
dls:documents query

该数字是一个注册的查询id,并且是确定的。也就是说,每次注册查询时都是相同的。这种行为在几个主要版本中都是不变的,但不能保证。如您所知,服务器可以随时注销查询。如果发生这种情况,任何使用该id的查询都将抛出
XDMP-UNREGISTERED
错误。因此,最好在需要时重新生成查询,可以再次调用
dls:documents query
。在与后续搜索相同的请求中执行此操作最安全


因此,我建议使用您自己版本的搜索端点扩展RESTAPI。您的新端点可以向输入查询添加
dls:documents query
。这样,注册的查询将在后续搜索的同一请求中生成。对于ML6,说明了如何执行此操作。

调用
dls:documents-query()
可确保查询已实际注册(如有必要,可以动态注册),但在REST api中则不起作用。您可以按照Mike的建议使用自定义扩展扩展扩展REST api,但也可以使用以下内容:

cts:properties-query(
  cts:and-not-query(
    cts:element-value-query(
      xs:QName("dls:latest"),
      "true",
      (),
      0
    ),
    cts:element-query(
      xs:QName("dls:version-id"),
      cts:and-query(())
    )
  )
)
这是由
dls:documents-query()
注册的查询。不过,这可能不是未来的证明,所以请在每次升级时进行检查。您可以在/Modules/MarkLogic/dls.xqy中找到函数的定义


啊,行得通。在这一点上,如果没有必要,我们宁愿不复制现有端点。谢谢