使用 search:search API 加入

Do joins using search:search API

使用 search:search API 时应该如何进行连接查询?

我在 'MarkLogic Dev General' 邮件列表的 Inside MarkLogic Server that one can use a 'Shotgun OR' (scatter query), but it doesn't use 'search:search'. In a message 中看到我发现理论上这可以通过搜索约束来完成,但我不明白它应该如何工作。

我的用例如下:

  1. 我使用 MarkLogic Java client API 来构造我的查询。如果可能,我想避免使用 xqy 扩展名。
  2. 我有两种实体(例如书籍和作者),我可能想进行如下查询:给我 1980 年出版的由巴西作者撰写的书籍。 IE。我想过滤两个实体并加入结果,而不对数据进行反规范化。

搜索 API 没有为 shotgun OR 提供声明性接口是正确的。

如果您使用的是 MarkLogic 9(尤其是最新版本中的性能增强),您可能会发现 Optic API 满足您的要求:

http://docs.marklogic.com/guide/java/OpticJava

Java API 不需要 shotgun OR,而是为实体之间直接连接的 Optic 查询提供了流畅的构建器。

如果您使用的是较早版本的 MarkLogic,或者如果 Optic 由于某种原因不符合您的要求,您可以通过使用值查询检索在第一个请求中与查询匹配的所有巴西作者的姓名:

http://docs.marklogic.com/guide/java/searches#id_83836

然后,使用检索到的值构建一个查询,以在第二个请求中检索这些作者所写的书籍:

http://docs.marklogic.com/guide/java/searches#id_70572

这可能就像构建名称值数组并将该数组传递到单个范围查询一样简单:

http://docs.marklogic.com/javadoc/client/com/marklogic/client/query/StructuredQueryBuilder.html#range-com.marklogic.client.query.StructuredQueryBuilder.RangeIndex-java.lang.String-java.lang.String:A-com.marklogic.client.query.StructuredQueryBuilder.Operator-java.lang.Object...-

这种基于 Java 的 shotgun OR 查询方法的成本包括两次网络往返:一次是从服务器到 Java 客户端获取名称列表,一次是获取文件。

为了使用 shotgun OR 获得更好的性能,在 MarkLogic enode 上创建一个 XQuery 或服务器端 JavaScript (SJS) 模块,该模块采用查询条件并执行 shotgun OR 查询,然后执行文档查询。然后,您可以使用调用执行 enode 模块:

http://docs.marklogic.com/guide/java/resourceservices#id_84134

或使用资源服务扩展:

http://docs.marklogic.com/guide/java/resourceservices#id_27702

希望对您有所帮助,