Java API 的 Marklogic 聚合查询
Marklogic Aggregate query with Java API
我正在尝试使用 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();
这些选项是围绕我想要的平均值的字段创建的。我为 和 创建了元素索引。然后,该查询允许我过滤具有特定内容 ID 的记录,然后获取其星级评分的平均值。
我正在尝试使用 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();
这些选项是围绕我想要的平均值的字段创建的。我为