如何解决用于在 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);
任何帮助将不胜感激。
谢谢, 啊
解决方法
一种方法是使用 TDE 将 payload/(a|b)
投影到两列视图中。
在 Java API 中,RowManager 然后可以根据这些列的条件匹配文档。使用 joinDoc()
操作加入并返回文档的全部内容。
另一种方法是在 payload/a
上定义路径范围索引,从而消除 payload/c/d/a
下的误报。范围索引的问题在于它们是重量级的(因为它们是内存映射的,无论是否使用它们都会使用资源)并且提供了不太通用的解决方案。
希望有所帮助,
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。