Marklogic 8 中的聚合 Java

Aggregations in Marklogic 8 Java

我正在尝试根据元素值对所有文档进行分组。通过 X-Query,我能够获取元素值及其对应的计数。但是,使用 Java API 我无法做到这一点。

X 查询:

for $name in distinct-values(doc()/document/<element_name>)
return fn:concat("Element Value:",$name,", Count:",fn:count(doc()/document/[element_name eq $name]));

输出:

Element Value:A, Count:100
Element Value:B, Count:200

Java:

QueryManager qryMgr = client.newQueryManager();
StructuredQueryBuilder qb = new StructuredQueryBuilder();
StructuredQueryDefinition querydef = qb.containerQuery(qb.element("<element_name>"), qb.term("A"));
SearchHandle handle = new SearchHandle();
qryMgr.search(querydef, handle);
System.out.println(handle.getTotalResults());

通过这种方法,我只能获取特定值的文档计数。有没有办法得到所有文件的数量。请帮助!

如果我理解你的用例,你可以使用范围索引来解决这个问题,即 - 你想知道特定元素的所有值是什么,然后有多少文档具有该值。这正是范围索引的用途。

尝试在 "element_name" 上添加范围索引 - 您可以为此使用 ML Admin 应用程序 - 转到您的数据库并单击元素范围索引。

在 XQuery 中,您可以执行如下操作:

for $val in cts:element-values(xs:QName("element_name"))
return text{$val, cts:frequency($val)}

使用 Java 客户端,您可以通过向搜索选项文件添加基于范围的约束来执行相同操作,然后来自 SearchManager 的响应将包含匹配的所有值和频率您的查询。查看 REST API 文档以构建此类搜索选项文件。