首页 > 解决方案 > 用于在 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

标签: javamarklogicmarklogic-9marklogic-10

解决方案


一种方法是使用 TDE 投影payload/(a|b)到两列视图中。

在 Java API 中,RowManager可以根据这些列的条件匹配文档。使用joinDoc()操作加入并返回文档的全部内容。

另一种方法是在 上定义路径范围索引payload/a,从而消除 下的误报payload/c/d/a。范围索引的关注点在于它们是重量级的(因为它们是内存映射的,无论是否使用它们都会使用资源)并且提供了一个不太通用的解决方案。

希望有帮助,


推荐阅读