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

RSuite 3.5.4 的查询功能源代码分析及修改
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里,进行检查。

Solution:
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.