首页 > 解决方案 > 使用 search:search API 进行连接

问题描述

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

我在内部 MarkLogic Server中看到可以使用“Shotgun OR”(分散查询),但它不使用“搜索:搜索”。在“MarkLogic Dev General”邮件列表的一条消息中,我发现理论上这可以通过搜索约束来完成,但我不明白它应该如何工作。

我的用例如下:

  1. 我使用MarkLogic Java 客户端 API来构建我的查询。如果可能,我想避免使用 xqy 扩展。
  2. 我有两种实体(例如书籍和作者),我可能想做如下查询:给我巴西作者于 1980 年出版的书籍。即我想过滤两个实体并加入结果,而不是对数据进行非规范化。

标签: marklogic

解决方案


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

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

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

Java API 不需要shotgun OR,而是为光学查询提供了一个流畅的构建器,可以在实体之间直接连接。

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

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。字符串: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

希望有帮助,


推荐阅读