java - Marklogic 使用 Java API 进行聚合查询

标签 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 上创建了一个字符串类型的元素范围索引。

最佳答案

在@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();

这些选项是围绕我想要平均值的字段创建的。我为 和 < content-id > 创建了元素索引。然后,该查询允许我过滤具有特定内容 ID 的记录,然后获取其星级的平均值。

关于java - Marklogic 使用 Java API 进行聚合查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43333551/

相关文章:

java - java android中的NSOperationQueue相当于什么?

java - 使用 Gson 序列化时如何公开类名

marklogic - cts :reference on document properties

marklogic - 如何使用 Roxy 从 marklogic 服务器检索配置

xquery - 在 MarkLogic 中比较同一文档的两个元素

java - 如何获取Struts2中freemarker中的action名称?

java - 如何使用 docx4j 在 docx 文件中附加数据

javascript - 如何在MarkLogic中获取两个xs.date的天数差异?

MarkLogic - URI 中的电子邮件地址

marklogic - 如何使用marklogic java api编写cts查询