使用MarkLogic中的Client Java API进行范围结构化查询

时间:2015-09-16 22:25:06

标签: java marklogic nosql

创建了以下元素范围索引: 标量类型:unsignedLong, localname :数字,

我正在运行以下代码:

    String options =
            "<search:options " +
                    "xmlns:search='http://marklogic.com/appservices/search'>" +
                "<search:constraint name='number'>" +
                    "<search:range type='xs:unsignedLong'>" +
                        "<search:element name='number' ns=''/>" +
                    "</search:range>" +
                "</search:constraint>" +
            "</search:options>";

    databaseClient.newServerConfigManager()
        .newQueryOptionsManager().writeOptions("myopt", new StringHandle(options));

    JSONDocumentManager jsonDocumentManager = 
                                     databaseClient.newJSONDocumentManager();

    for (int i = 0; i < 10; i++) {
        jsonDocumentManager.write("/somepath/"+ i +".json", 
                                 new StringHandle("{\"number\": \""+i+"\"}"));
    }


    QueryDefinition queryDefinition = new StructuredQueryBuilder()
        .rangeConstraint("number", StructuredQueryBuilder.Operator.GT, "5");
    queryDefinition.setOptionsName("myopt");

    StringHandle searchHandle = databaseClient.newQueryManager()
        .search(queryDefinition, new StringHandle());
    System.out.println(searchHandle.get());

我希望得到数字大于5的文档,但我的搜索结果是空的。也许我错过了什么?

我正在使用MarkLogic server 7.0,client-api-java 2.0.5。

谢谢,Hlib

更新

我在另一台机器上运行类似的代码,它运行正常。试图找出差异

1 个答案:

答案 0 :(得分:1)

该代码工作的环境是否可能正在运行MarkLogic 8?

在MarkLogic 7上,JSON在特殊命名空间中作为XML持久化。您可以使用该命名空间定义范围索引:

http://docs.marklogic.com/7.0/guide/rest-dev/search#id_95526

然后,使用json-key而不是element指定范围约束:

<search:json-key>number</search:json-key>

在MarkLogic 8中,JSON持久化为JSON,因此您不必使用命名空间定义索引,而是使用json-property而不是json-key。

希望有帮助,