java - 用于在 JSON 文档中搜索特定路径的 MarkLogic Java API
问题描述
我正在使用 MarkLogic Java API 搜索存储在 MarkLogic 9 集合中的 JSON 文档。我的 JSON 结构如下
{
"time": "2021-02-09T11:09:53",
"payload": {
"a": "v1",
"b": "v2",
"c": [
{
"d": {
"a": "v1",
"b": "v2"
}
}
]
}
}
我正在尝试搜索/payload/a=v1 和 /payload/b=v2但搜索还会返回/payload/c/d/a=v1 和 /payload/c/d/b=v2的所有文档
这是我的Java代码
StructuredQueryBuilder sqb = queryManager.newStructuredQueryBuilder();
List<StructuredQueryDefinition> list = new ArrayList<>();
list.add(sqb.collection("collectionName"));
StructuredQueryDefinition a = sqb.value(sqb.jsonProperty("a"), "v1");
StructuredQueryDefinition b = sqb.value(sqb.jsonProperty("b"), "v2");
list.add(sqb.and(sqb.containerQuery(sqb.jsonProperty("payload"), sqb.and(a, b)))));
StructuredQueryDefinition definition = sqb.and(list.toArray(new StructuredQueryDefinition[list.size()]));
DocumentPage page = docManager.search(definition, 1L);
任何帮助将不胜感激。
谢谢,AK
解决方案
一种方法是使用 TDE 投影payload/(a|b)
到两列视图中。
在 Java API 中,RowManager可以根据这些列的条件匹配文档。使用joinDoc()
操作加入并返回文档的全部内容。
另一种方法是在 上定义路径范围索引payload/a
,从而消除 下的误报payload/c/d/a
。范围索引的关注点在于它们是重量级的(因为它们是内存映射的,无论是否使用它们都会使用资源)并且提供了一个不太通用的解决方案。
希望有帮助,
推荐阅读
- intellij-idea - 告诉 IntelliJIdea 使用特定的 JDK 版本,不仅仅是 JDK8,而是 jdk-8u201
- android - 当片段数量超过 50 个但每个片段具有相同的布局和方法时,处理 ViewPager 和片段的正确方法是什么?
- spring-boot - localhost:8080\sendMesssage 上的 Whitelabel 错误页面?
- python - Django / Factoryboy - 无法删除测试中的实例
- sql - 设置新变量等于表达式时列名无效
- docker - 清理 Docker Swarm 中未引用的配置和机密
- css - 使用 Jpeg 用纯 CSS 遮罩另一个图像?
- java - 我无法让应用程序构建 sqlite 数据库
- python-3.x - 如何添加到文件顶部?
- tableau-api - Tableau Server 站点或用户中的任何列是否可自定义?