Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MarkLogic Java API,用于在JSON文档中搜索特定路径_Java_Marklogic_Marklogic 9_Marklogic 10 - Fatal编程技术网

MarkLogic Java API,用于在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": [ { "

我正在使用MarkLogicJavaAPI搜索存储在MarkLogic9集合中的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);

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。还有别的办法吗。