Marklogic REST API搜索最新文档版本。

3
我们需要使用Marklogic的REST API将搜索限制为托管文档的最新版本。我们正在使用MarkLogic 6。
使用直接的XQuery,你可以在additional-query选项中使用dls:documents-query()(请参见Is there any way to restrict marklogic search on specific version of the document)。
但是REST API需要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>

除了不完全透明之外,那个数字有多安全?我们需要将其放入查询选项中,因此它不是每次需要时都可以重新生成的。我在这里看了两个不同的安装程序,这个数字是相同的,但它是否保证相同,并且是否会改变?比如,在 MarkLogic 升级时会发生什么?
此外,假设该数字是安全的,那么注册查询始终会存在吗?文档说明系统可能会定期清除已注册的查询,但它所讨论的是用户定义的注册查询,我不确定其中有多少适用于内部查询。
这是正确的方法吗?如果我们无法这样做,我们可以始终设置集合并通过这种方式限制搜索,但我们更愿意使用 dls:documents-query(如果可能)。
2个回答

2
该数字是一个已注册的查询ID,是确定性的。也就是说,每次注册查询时它都是相同的。这种行为在几个主要版本中是不变的,但不能保证永远如此。正如您已经知道的那样,服务器可以随时取消注册查询。如果发生这种情况,任何使用该ID的查询都会抛出XDMP-UNREGISTERED错误。因此,最好在需要时重新生成查询,例如再次调用dls:documents-query。最安全的做法是在后续搜索的同一请求中执行此操作。
因此,我建议扩展REST API,使用自己的版本的搜索端点。您的新端点可以将dls:documents-query添加到输入查询中。这样,注册的查询将在同一请求中与后续搜索一起生成。对于ML6,http://docs.marklogic.com/6.0/guide/rest-dev/extensions解释了如何实现此操作。

1

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 中找到该函数的定义。
希望对您有所帮助!

啊,这样就可以了。在这个阶段,如果不必要的话,我们宁愿不复制现有的端点。谢谢! - paloma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接