marklogic - 使用 search:search API 进行连接
问题描述
使用 search:search API 时应该如何进行连接查询?
我在内部 MarkLogic Server中看到可以使用“Shotgun OR”(分散查询),但它不使用“搜索:搜索”。在“MarkLogic Dev General”邮件列表的一条消息中,我发现理论上这可以通过搜索约束来完成,但我不明白它应该如何工作。
我的用例如下:
- 我使用MarkLogic Java 客户端 API来构建我的查询。如果可能,我想避免使用 xqy 扩展。
- 我有两种实体(例如书籍和作者),我可能想做如下查询:给我巴西作者于 1980 年出版的书籍。即我想过滤两个实体并加入结果,而不是对数据进行非规范化。
解决方案
搜索 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
这可以像构造一个名称值数组并将该数组传递给单个范围查询一样简单:
这种基于 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
希望有帮助,
推荐阅读
- php - Spatie\Permission with Spatie\Translatable 不适用于角色和权限模型 | 斯派蒂 | 拉拉维尔
- android - 如何搜索或过滤列表
来自 JSON 数组? - flutter - 颤振无法导入`flutter_webrtc.dart`
- python - 当我尝试使用 tkinter 将图像加载到画布上时,是什么导致错误“未知选项“pyimage1””?
- javascript - 试图从 Point A LLA 的角度将 Point B LLA 转换为 ECEF
- firebase - 从 Firebase 控制台手动删除文档而不删除子集合时,我应该怎么做才能触发 onDelete firebase 功能?
- python - 在python中将日期转换为列表
- docker - 一个运行 Apache 的容器内的多个站点:来自外部的虚拟主机?
- c# - 如何返回 DispatcherOperation
从模拟对象 - sql - SQL Server CTE 层次结构数据类型转换