使用Java API进行Marklogic聚合查询

时间:2017-04-10 21:59:39

标签: java marklogic marklogic-8

我正在尝试使用ML Java API运行聚合查询,并且遇到了一些麻烦。我已经遵循了文档,但是需要一个值约束,我不确定它应该是什么样子。我尝试了以下方法:

    String options =
            "<options xmlns:search=\"http://marklogic.com/appservices/search\">" +
            "   <values name=\"average\">" +
            "       <range type=\"xs:string\">" +
            "           <element ns=\"\" name=\"content-id\"/>" +
            "       </range>" +
            "   </values>" +
            "</options>";

    StringHandle handle = new StringHandle(options);
    QueryOptionsManager optMgr = client.newServerConfigManager().newQueryOptionsManager();
    optMgr.writeOptions("average", handle);
    QueryManager queryManager = client.newQueryManager();
    StructuredQueryBuilder queryBuilder = queryManager.newStructuredQueryBuilder();
    ValuesDefinition valuesDefinition = queryManager.newValuesDefinition("average");
    valuesDefinition.setAggregate("avg");
    valuesDefinition.setQueryDefinition(queryBuilder.value(queryBuilder.element("content-id"),contentId));

    ValuesHandle results = queryManager.values(valuesDefinition, new ValuesHandle());

我根据我正在使用的其他选项对选项进行了尝试。但是,当我尝试编写选项时,它会告诉我无效内容:意外的有效负载

我感觉我的方式是错误的。基本上我想找到元素“content-id”中具有给定值的所有文档,然后获得另一个名为“star-rating”的元素的平均值。

是否应为“content-id”或“star-rating”设置选项?文档没有显示queryDefinition的使用,我应该删除它吗?修改它?在Java中有更简单的方法吗?

编辑:忘记提及,我还在content-id上创建了一个元素范围索引,类型为字符串。

1 个答案:

答案 0 :(得分:2)

在@SamMefford的指导下,我能够找到解决方案。它看起来像这样:

    String options =
            "<options xmlns=\"http://marklogic.com/appservices/search\">" +
            "   <values name=\"star-rating\">" +
            "       <range type=\"xs:float\">" +
            "           <element ns=\"\" name=\"star-rating\"/>" +
            "       </range>" +
            "   </values>" +
            "</options>";

    StringHandle handle = new StringHandle(options);
    QueryOptionsManager optMgr = client.newServerConfigManager().newQueryOptionsManager();
    optMgr.writeOptions("star-rating", handle);
    QueryManager queryManager = client.newQueryManager();
    StructuredQueryBuilder queryBuilder = 
        queryManager.newStructuredQueryBuilder("star-rating");
    ValuesDefinition valuesDefinition = queryManager.newValuesDefinition("star-rating");
    valuesDefinition.setAggregate("avg");
    valuesDefinition.setQueryDefinition(
        queryBuilder.range(
            queryBuilder.element("content-id"),"string", 
            StructuredQueryBuilder.Operator.EQ,contentId
        )
    );

    String results = queryManager.values(valuesDefinition, new ValuesHandle())
       .getAggregate("avg").getValue();

选项是围绕我希望平均值的字段创建的。我为两个&lt;创建了元素索引。星级&gt;和&lt; content-id&gt;。然后,该查询允许我过滤到具有特定内容ID的记录,然后获取其星级评分的平均值。