我们需要使用 MarkLogic 的 REST api 将 MarkLogic 搜索限制为最新版本的托管文档。我们正在使用 MarkLogic 6。
直接使用xquery,你可以使用dls:documents-query()
作为附加查询选项(请参阅
Is there any way to restrict marklogic search on specific version of the document ).
但是 REST api 需要 XML,而不是任意的 xquery。您可以很容易地将普通的 cts 查询转换为 XML(在 QConsole 中执行 <some-element>{cts:word-query("hello world")}</some-element>
)。
如果我尝试使用 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
如果可能的话。
最佳答案
该数字是注册的查询 ID,并且是确定性的。也就是说,每次注册查询时都会相同。这种行为在几个主要版本中是不变的,但不能保证。正如您所知,服务器可以随时注销查询。如果发生这种情况,任何使用该 ID 的查询都将抛出一个 XDMP-UNREGISTERED
错误。因此,最好在需要时重新生成查询,也许可以通过再次调用 dls:documents-query
来生成。在后续搜索的相同请求中执行此操作是最安全的。
因此,我建议使用您自己的搜索端点版本来扩展 REST API。您的新端点可以将 dls:documents-query
添加到输入查询中。这样,注册查询将在后续搜索的同一请求中生成。对于 ML6,http://docs.marklogic.com/6.0/guide/rest-dev/extensions解释了如何做到这一点。
关于rest - Marklogic REST API 搜索最新文档版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21029650/