MarkLogic-如何在structuredQueryBuilder中使用andNot

时间:2017-06-03 16:34:20

标签: marklogic marklogic-8 marklogic-7

{“uuid”:121222151,“path”:“/ aaa / bbb / ccc.json”,“name”:“newDoc1”, “uuid”:121222152,“path”:“/ aaa / ddd.json”,“name”:“newDoc1”}

我正在使用StructuredQueryBuilder搜索结果。

StructuredQueryBuilder queryBuilder = new StructuredQueryBuilder();
StructuredQueryDefinition containPositiveQuery = queryBuilder.containerQuery(queryBuilder.jsonProperty("name"), queryBuilder.term("newDoc1"));
StructuredQueryDefinition containNegativeQuery = queryBuilder.containerQuery(queryBuilder.jsonProperty("path"), queryBuilder.term("*/bbb/*"));
StructuredQueryDefinition containQuery = qb.andNot(containPositiveQuery, containNegativeQuery);

我希望结果搜索名称“newDoc1”,但不能在包含“* / bbb / *”的路径中搜索。上面的代码不起作用。可能是什么原因?

2 个答案:

答案 0 :(得分:1)

您的示例JSON文档是扁平的。没有嵌套对象。因此,没有要查询的容器。为了实现您的目标,我猜测您的文档需要看起来更像这样:

{ "container": {
    "uuid": 121222151,
    "path": "/aaa/bbb/ccc.json", 
    "name": "newDoc1"
  },
  "container": {
    "uuid": 121222152,
    "path": "/aaa/ddd.json", 
    "name": "newDoc1"
  }
}

您的查询更像是这样:

StructuredQueryBuilder queryBuilder = new StructuredQueryBuilder();
StructuredQueryDefinition positiveQuery = queryBuilder.term("newDoc1");
StructuredQueryDefinition negativeQuery = queryBuilder.term("*/bbb/*");
StructuredQueryDefinition containQuery = 
  queryBuilder.containerQuery(queryBuilder.jsonProperty("container"), 
    qb.andNot(positiveQuery, negativeQuery));

我现在无法完全测试,但希望这会让你朝着正确的方向前进。

答案 1 :(得分:1)

您是否为路径属性启用了通配符索引?如果没有,您可能希望在path属性上创建一个字段,并仅为该字段打开通配符索引。

要了解通配符搜索,请参阅:

http://docs.marklogic.com/guide/search-dev/wildcard

如果您只需要该JSON属性的通配符,则启用特定字段的通配符是有意义的。