Marklogic REST API搜索最新文档版本

时间:2014-01-09 19:43:25

标签: rest marklogic

我们需要使用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

2 个答案:

答案 0 :(得分: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 :(得分: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

中找到该函数的定义

HTH!