RSuite 3.5.4 的查询功能源代码分析及修改

本文讨论了RSuite系统中搜索机制的优化策略,包括调整maxHits和bucketsize参数以提高搜索效率,修改RSuite搜索代码及XQuery脚本,以及解决搜索过程中出现的问题。
1. Bucketsize 代表 rsuite.search.bucketSize within rsuite.properties.
com.reallysi.rsuite.system.search.BaseReferencedByFilter.referencedMOs 存放了经过search scope过滤的来自于CA结果集的MO id

maxHits 控制CA过滤容器里的结果集数量,如果该值较小,MO查询出来的当前bucket里的结果不符合CA过滤器里的结果要求,MO会继续往下一个bucket里装数据,并将数据放入CA过滤器里过滤,直到当前页中装满所要求的结果集内容(一页默认装10个结果)。


2. 何时结束 数据库的查询,表示已经获取了足够多的用以返回页面的结果集?
2.1 com.reallysi.rsuite.system.search.ResultItemsCollection.getResult

查询当前页上的某条数据时,如果这条数据已经在RSuite里的filteredItemList 里存在,就不去MarkLogic去查,如果不存在,就往bucket里装数据。Bucket里存放的数据个数取决于bucketsize。Bucketsize 控制了这一次数据查询所产生的结果集个数,bucket里放的数据是未经过过滤器过滤的数据。
SearchResource的rs-start,rs-end控制了一页中的结果集个数。

2.2 当RSuite里的filteredItemList 里的数据已经放入了被查询的当前页上的某条数据时,就结束数据查询动作。
参考: com.reallysi.rsuite.system.search.ResultItemsCollection.fillBucketsUntilFilteredSize (347th line)

3. 翻页之后,间隔的结果集个数超过了bucketsize的值,结果集的总个数会发生变化
查询MO (process-fulltext-search-items)的翻页参数值,会影响结果集的总个数。
Sample is pending

4. 翻页之后,间隔的结果集个数超过了bucketsize的值,会将目标页之前的尚未填满的filteredItemList 填满。
此时,会花费较大的开销。如果当前在第十页,调到第50页,bucketsize是20,“查询”模块会不断填充unfilteredBuckets和filteredItemList。
参考: com.reallysi.rsuite.system.search.ResultItemsCollection.fillBucketsUntilFilteredSize (347th line)

修改后的代码:参考附件modified_code.zip

CA 过滤器的说明和相关代码修改,将陆续补上。
CA 过滤器的代码分析
RSuite获取CA过滤器的CA结果集的汇总摘要信息后,针对每个CA接点,查出他的MO纪录集的个数和ID列表,然后根据MO id列表查询出与每个MO id相关的所有MO的信息,将这些MO放入过滤数据池referencedMOs中。

优化方案:
RSuite获取CA过滤器的CA结果集的汇总摘要信息后,针对每个CA接点,查出他的MO纪录集的个数和ID列表,不去查每个MO的详细信息。而是将MO 查询出来的结果集里的MO传入checkMOExsitsCA里,进行检查。

[b]Solution:[/b]
1. maxHits and bucketsize
2. tune RSuite Search code
3. tune RSuite Xquery script


备注:
com.reallysi.rsuite.system.repository.XccRunner.executeToStringArray, transform node to string
com.reallysi.RSuiteStartup

Bugs
When there is exception thrown, it causes Search broken and information about running search showingSearch progress-bar

com.reallysi.rsuite.system.search.ReferencedByContentAssemblyFilter.getReferencedMOorDescendentsForSearchObjectCriteria

for context.getManagedObjectKernel().getManagedElementTreesByIds, when ids is empty, it rised up that index is out for buf.replace(buf.lastIndexOf(","), buf.length(), "");

rsuite.repository.marklogic.forcexquery09dialect
if it is not specified, RSuite sets XQueryDialect to MARKLOGIC_XQUERY_0_9. It is paid attention that “default xquery version” within XDBC Server on MarkLogic Server need to set value corresponding to XQueryDialect within RSuite.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值