范围结构化查询使用客户端Java API在MarkLogic



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

我正在运行以下代码:

    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

我在另一台机器上运行类似的代码,它工作正常。

该代码工作的环境是否可能运行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。

希望有帮助,

最新更新