基于javaapi的Marklogic聚合查询

基于javaapi的Marklogic聚合查询,java,marklogic,marklogic-8,Java,Marklogic,Marklogic 8,我正在尝试使用ML Java API运行聚合查询,但遇到了一些麻烦。我遵循了文档,但是需要一个值约束,我不确定它应该是什么样子。我尝试了以下方法: String options = "<options xmlns:search=\"http://marklogic.com/appservices/search\">" + " <values name=\"average\">" + "

我正在尝试使用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());
字符串选项=
"" +
"   " +
"       " +
"           " +
"       " +
"   " +
"";
StringHandle=新的StringHandle(选项);
queryoptionmanager optMgr=client.newServerConfigManager().newqueryoptionmanager();
optMgr.writeOptions(“平均”,句柄);
QueryManager QueryManager=client.newQueryManager();
StructuredQueryBuilder queryBuilder=queryManager.newStructuredQueryBuilder();
ValuesDefinition ValuesDefinition=queryManager.newValuesDefinition(“平均”);
价值定义。集总(“平均”);
valuesDefinition.setQueryDefinition(queryBuilder.value(queryBuilder.element(“内容id”),contentId));
ValuesHandle results=queryManager.values(valuesDefinition,新的ValuesHandle());
我尝试了一些基于我正在使用的其他选项的选项。但是,当我尝试写入选项时,它告诉我无效内容:意外的有效负载

我觉得我走错了方向。本质上,我希望在元素“content id”中找到所有具有给定值的文档,然后得到另一个元素“starrating”的平均值

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


编辑:忘了提到,我还在内容id上创建了一个元素范围索引,类型为string。

在@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();
字符串选项=
"" +
"   " +
"       " +
"           " +
"       " +
"   " +
"";
StringHandle=新的StringHandle(选项);
queryoptionmanager optMgr=client.newServerConfigManager().newqueryoptionmanager();
optMgr.writeOptions(“星级”,手柄);
QueryManager QueryManager=client.newQueryManager();
StructuredQueryBuilder queryBuilder=
queryManager.newStructuredQueryBuilder(“星级”);
ValuesDefinition ValuesDefinition=queryManager.newValuesDefinition(“星级”);
价值定义。集总(“平均”);
valuesDefinition.setQueryDefinition(
queryBuilder.range(
元素(“内容id”),“字符串”,
StructuredQueryBuilder.Operator.EQ,contentId
)
);
String results=queryManager.values(valuesDefinition,new ValuesHandle())
.getAggregate(“平均”).getValue();

这些选项是围绕我想要平均值的字段创建的。我为创建了元素索引。然后,查询允许我筛选具有特定内容id的记录,然后获得它们的星级评级的平均值。

您可以添加setQueryDefinition以筛选“内容id”。但是,您不需要使用选项按“内容id”中的给定值进行筛选。只需使用queryBuilder.range()而不是queryBuilder.value()。您确实需要在下的选项中添加“星级”,并且您的值定义应该围绕此进行。@SamMefford我更改为range()并修改了选项,将星级设置为而不是内容id,但是我得到一个错误,说无效参数:没有值或元组规范名为:star Rating试图用谷歌搜索错误,但我没有得到anything@SamMefford别介意我的上述评论。忘记将选项名称添加到查询生成器是一个愚蠢的错误。它现在似乎正在工作。谢谢