我有一个带有以下视图的多米诺骨牌数据库:
Project_no Realization_date Author
1/2005 2015-01-02 Alex/Acme
3/2015 2015-02-20 John/Acme
33/2015 2016-06-20 Henry/Acme
44/2015 2015-02-13 John/Acme
...
现在我希望从这个视图中获取所有项目,即" 3" (部分匹配),按Realization_date降序排序,并在Xpage上显示前1000个。
视图很大 - 有些选择可以给我500.000个文档。
FT搜索视图选项不可接受,因为它仅返回5.000个文档。
创建ArrayList或ListMap导致java内存不足异常(java Domino对象被回收)。超过内存可能当然有帮助,但我们有30万用户,所以它可能是不够的。
你有什么想法我怎么能做到这一点?
答案 0 :(得分:2)
正如Frantisek所说,我认为关键在于用户想要对输出做些什么。
如果是导出,我会导出数据而不进行排序,然后在电子表格中排序。
如果是显示,我希望有一些分页,否则将HTML从服务器推送到浏览器需要很长时间,所以我建议在Project_no和Realization_date之间进行FT搜索范围和“分块”您的要求。你需要一个手动寻呼机来加载下一组结果,但是如果你期望那么多,那么你就不会得到一个能够计算总页数的寻呼机。
此外,如果它是XAgent或一次性显示所有内容,请在相关XPage上设置viewState =“nostate”。否则,每个请求都将被序列化到磁盘。因此,您的搜索结果会被序列化到磁盘/内存,这可能是导致您看到的Java内存问题的原因。
记住FT_MAX_SEARCH_RESULTS notes.ini变量可以在服务器上修改,以将(默认)最大值从5000增加。
500,000是一个非常高的结果集,并且可能不会使它对它们的任何后续操作非常用户友好。我可能还建议限制搜索,例如强制单独输入“2015”部分或阻止仅输入一个数字,因此它必须是例如“30”而不仅仅是“3”。这也可能意味着修改您的视图,因此Project_no格式显示为@Right("0000" + @Left(Project_no,"/"), 4)
,因此用户不会获得3,30,31,32 .... 300,301,302 ....,但可以搜索“003”并且只找到30,31,32 ......,39。这实际上取决于用户想要做什么,可能需要在框外思考,快速让他们访问目标文档集他们想要采取行动。
答案 1 :(得分:1)
我会为您的视图优化数据结构。例如,制作一个ArrayList<view entry>
,代表您视图中的最小信息。它模仿了索引。 &#34;查看条目&#34;不是Notes对象(Document,ViewEntry),而是一个简化的POJO,它将保存足够的信息以对其进行排序(通过比较器)并显示或查找实际数据 - 例如要显示的Subject列和UNID以建立一个打开的链接文献。
这种结构应该适合每个文档几百个字节。麻烦的部分是填充该结构 - 即使使用ViewNavigator,构建此类列表可能需要几分钟。
答案 2 :(得分:0)
如果过滤基于第一个排序列的部分匹配,那么就有一个基于Domino的纯解决方案。它要求Domino服务器是8.5.3或更高版本(8.5.3中引入了view.resortView),并且implements_date列已经点击进行排序。
使用getAllEntriesByKey(键,false)&lt; - 部分匹配
调用view.resortView(&#34; name_of_realization_date_column&#34;)
创建所有条目的集合,现在按realize_date
将已排序的集合与已过滤的集合相交。这为您提供了您想要按calculate_date排序的条目。例如。 sortedCollection.intersect(filteredCollection)
伪代码:
..
View view = currentDb.getView( "projectsView" );
view.setAutoUpdate( false );
ViewEntryCollection filteredCollection = view.getAllEntriesByKey( userFilter, False );
// Use index where view is sorted by realization_date
view.resortView( "realization_date" );
// All entries sorted by realization_date
ViewEntryCollection resortedCollection = view.getAllEntries();
resortedCollection.intersect( filteredCollection );
// resortedCollection now contains only the entries in filteredCollection, sorted by realization_date
..
我不确定这是否比创建自定义数据结构更快,但我认为值得测试:)