如何使用FileNet CE API统计对象存储库指定时间段的文档数量
问题根因
- FileNet CE服务端默认配置了
QueryMaxRecords参数,默认值为200,会覆盖客户端设置的setMaxRecords值,即使客户端设置了10万的上限也会被服务端强制截断 - 你当前用遍历分页累加的方式统计总量,不仅效率极低,百万级数据下很容易超时,也绕不开服务端的默认查询返回上限
- 原代码存在变量名不一致、方法调用缺括号的语法问题
解决方案
方案1:直接统计总数(优先推荐,效率最高)
不需要查询文档详情,直接用SQL的COUNT聚合函数,服务端会直接返回统计结果,不会触发分页限制:
SearchScope scope = new SearchScope(obj); SearchSQL sql = new SearchSQL(); // 聚合查询仅返回单条结果,无需设置setMaxRecords String query = "SELECT COUNT(*) FROM Document WHERE DateCreated > 你的时间参数"; sql.setQueryString(query); RepositoryRowSet res = scope.fetchRows(sql, 1, null, null); int totalCount = 0; if (res.iterator().hasNext()) { RepositoryRow row = res.iterator().next(); totalCount = (Integer) row.getProperties().get("COUNT").getValue(); }
方案2:如果需要拉取全量文档数据(不止统计总数)
先联系CE管理员调整服务端配置,将QueryMaxRecords调整为适配业务的上限,或者设置为0解除查询返回条数限制,再修改客户端查询逻辑:
SearchScope scope = new SearchScope(obj); SearchSQL sql = new SearchSQL(); // 服务端解除限制后,这里设置为0即可不限制返回条数 sql.setMaxRecords(0); // 不要用SELECT *,只取需要的字段降低性能开销 String query = "SELECT Id, DocumentTitle, DateCreated FROM Document WHERE DateCreated > 你的时间参数"; sql.setQueryString(query); // 第四个参数设为Boolean.TRUE启用可持续查询,绕过单次查询返回上限 RepositoryRowSet res = scope.fetchRows(sql, 1000, null, Boolean.TRUE); int count = 0; PageIterator p = res.pageIterator(); while (p.nextPage()) { count += p.getElementCount(); // 可在此处处理当前页的文档数据 Object[] currentPageDocs = p.getCurrentPage(); }
注意事项
- 仅统计总数优先用COUNT聚合查询,性能比遍历全量文档高几个数量级,百万级数据也能秒返回结果
- 时间查询条件建议用参数化方式传入,避免日期格式解析错误
内容的提问来源于stack exchange,提问作者Salman
相关产品推荐
相关产品推荐

