使用搜索进行加入:搜索API

时间:2018-06-18 13:32:16

标签: marklogic

使用搜索时如何进行连接查询:搜索API?

我在Inside MarkLogic Server中看到可以使用'Shotgun OR'(散点查询),但它不使用'search:search'。在一个message的'MarkLogic Dev General'邮件列表中,我发现理论上这可以通过搜索约束来完成,但我无法理解它究竟应该如何工作。

我的用例如下:

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

1 个答案:

答案 0 :(得分:1)

Search API没有为霰弹枪OR提供声明性接口是正确的。

如果您正在使用MarkLogic 9(特别是最新版本中的性能增强功能),您可能会发现Optic API符合您的要求:

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

Java API不是要求霰弹枪OR,而是为实体之间直接连接的Optic查询提供了一个流畅的构建器。

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

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的猎枪OR查询方法的成本包括两个网络往返:一个用于获取从服务器到Java客户端的名称列表,另一个用于获取文档。

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

执行enode模块

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

或使用资源服务扩展程序:

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

希望有帮助,