MarkLogic Java API,用于在JSON文档中搜索特定路径
我正在使用MarkLogicJavaAPI搜索存储在MarkLogic9集合中的JSON文档。我的JSON结构如下MarkLogic Java API,用于在JSON文档中搜索特定路径,java,marklogic,marklogic-9,marklogic-10,Java,Marklogic,Marklogic 9,Marklogic 10,我正在使用MarkLogicJavaAPI搜索存储在MarkLogic9集合中的JSON文档。我的JSON结构如下 { "time": "2021-02-09T11:09:53", "payload": { "a": "v1", "b": "v2", "c": [ { "
{
"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);
StructuredQueryBuilder sqb=queryManager.newStructuredQueryBuilder();
列表=新的ArrayList();
列表.添加(sqb.集合(“集合名称”));
StructuredQueryDefinition a=sqb.value(sqb.jsonProperty(“a”),“v1”);
StructuredQueryDefinition b=sqb.value(sqb.jsonProperty(“b”),“v2”);
添加(sqb.and(sqb.containerQuery(sqb.jsonProperty(“payload”)、sqb.and(a,b‘‘‘‘)’);
StructuredQueryDefinition=sqb.and(list.toArray(新的StructuredQueryDefinition[list.size()]);
DocumentPage=docManager.search(定义,1L);
任何帮助都将不胜感激
谢谢,
AK一种方法是使用TDE将
有效载荷/(a | b)
投影到两列视图中
在JavaAPI中,可以根据这些列的条件匹配文档。使用joinDoc()
操作联接并返回文档的全部内容
另一种方法是在有效载荷/a
上定义路径范围索引,这将消除有效载荷/c/d/a
下的误报。关于范围索引的问题是它们是重量级的(因为它们是内存映射的,无论是否在使用它们都会使用资源),并且提供了一个不太通用的解决方案
希望这能有所帮助,此xquery在fn:collection('collection')[payload/a=“v1”][payload/b=“v2”]中工作。有没有办法将其转换为Java API。在可搜索表达式中使用这些XPath谓词需要过滤,因此无法扩展。搜索引擎必须检索集合中的每个文档,以查看XPath是否与文档匹配。对于索引解决方案,可以使用TDE或路径范围索引。我对MarkLogic不太熟悉,所以不太了解。你有什么样的样本我可以参考,因为我在浏览文档时迷路了。感谢TDE的良好起点可能是和;不幸的是,路径范围索引的一个良好起点可能是,我有只读权限,因此无法创建任何TDE。还有别的办法吗。