我正在尝试根据元素值对所有文档进行分组。通过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 文档以构建此类搜索选项文件。
关于xquery - Marklogic 8 Java 中的聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50718004/