Plone - ZODB 目录查询 sort_on 多个索引?
Plone - ZODB catalog query sort_on multiple indexes?
我有一个带有开始和结束日期的 ZODB 目录查询。我想先对 end_date 上的结果进行排序,然后再对 start_date 上的结果进行排序。
按 end_date 或 start_date 排序都可以。
我尝试使用元组 (start_date,end_date
),但没有成功。
有没有办法实现这一点,或者之后是否必须采用一些自定义逻辑?
一般的答案应该是 post-hoc-sort 整个结果集的目录大脑,使用 zope.sequencesort (via PyPI,但已经与 Plone 一起提供)或类似的。
更复杂的答案是优化的兔子洞,只有在您知道自己需要并且知道自己在做什么时才应该进行优化:
- 确保当您对 brain 进行排序时,您的用户会获得到同一实例的粘性会话,至少对于缓存亲和性而言,以获得相同的目录索引和 brain(元数据);
- 如果您希望用户返回并需要在后续批次。当然,RID 需要重新构造到 ZCatalog 的大脑惰性序列中,这需要一些知识(或阅读源代码)。
- 最后,对于大型结果集(数千),我建议通过对当前批次进行 post-hoc 排序直到它之后的 n 批次,其中 n 与 len(site.portal_catalog.uniqueValuesFor(indexnamehere)) 成反比。对于大量结果,近似二次排序的正确性对于高变异性较高,而对于低变异性较低(许多具有相同二次值的项目,因此计数远大于批量大小可能会令人沮丧)。
除非您要处理特别大的结果集,否则不要这样优化。
不言而喻:如果您进行了优化,则需要验证您是否确实获得了出色的结果(配置文件和基准测试)。如果你不能证明花时间做这件事是合理的,你就不能证明优化是合理的。
我有一个带有开始和结束日期的 ZODB 目录查询。我想先对 end_date 上的结果进行排序,然后再对 start_date 上的结果进行排序。
按 end_date 或 start_date 排序都可以。
我尝试使用元组 (start_date,end_date
),但没有成功。
有没有办法实现这一点,或者之后是否必须采用一些自定义逻辑?
一般的答案应该是 post-hoc-sort 整个结果集的目录大脑,使用 zope.sequencesort (via PyPI,但已经与 Plone 一起提供)或类似的。
更复杂的答案是优化的兔子洞,只有在您知道自己需要并且知道自己在做什么时才应该进行优化:
- 确保当您对 brain 进行排序时,您的用户会获得到同一实例的粘性会话,至少对于缓存亲和性而言,以获得相同的目录索引和 brain(元数据);
- 如果您希望用户返回并需要在后续批次。当然,RID 需要重新构造到 ZCatalog 的大脑惰性序列中,这需要一些知识(或阅读源代码)。
- 最后,对于大型结果集(数千),我建议通过对当前批次进行 post-hoc 排序直到它之后的 n 批次,其中 n 与 len(site.portal_catalog.uniqueValuesFor(indexnamehere)) 成反比。对于大量结果,近似二次排序的正确性对于高变异性较高,而对于低变异性较低(许多具有相同二次值的项目,因此计数远大于批量大小可能会令人沮丧)。
除非您要处理特别大的结果集,否则不要这样优化。
不言而喻:如果您进行了优化,则需要验证您是否确实获得了出色的结果(配置文件和基准测试)。如果你不能证明花时间做这件事是合理的,你就不能证明优化是合理的。