Plone - ZODB目录查询sort_on多个索引?

时间:2017-04-11 23:31:09

标签: indexing plone zodb

我有一个带有开始和结束日期的ZODB目录查询。我想先在end_date上对结果进行排序,然后在start_date中对结果进行排序。

对end_date或start_date进行排序工作正常。

我尝试了一个元组(start_date,end_date),但没有运气。

有没有办法实现这一点,或者之后必须使用一些自定义逻辑?

1 个答案:

答案 0 :(得分:3)

广义的答案应该是事后 - 整个目录大脑的整个结果集,使用zope.sequencesort(通过PyPI,但已经与Plone一起提供)或类似的。

更复杂的答案是优化的兔子洞,如果你知道自己需要知道自己在做什么,那么你应该只做下去:

  1. 确保何时对用户获取同一实例的粘性会话的大脑进行排序,至少对于cache-affinity来获取相同的目录索引和大脑(元数据);
  2. 如果您希望用户在后续批次中返回并需要,您可能希望跨请求(线程全局)缓存唯一会话ID,以及整个已排序请求的目录RID(整数)值序列。当然,RID需要重新构建成ZCatalog的懒人序列,这需要一些技术诀窍(或阅读源代码)。
  3. 最后,对于大型结果(数千个)集合,我建议通过对当前批次的事后排序到其后的n个批次的末尾来进行特定于应用程序的妥协是合理的。 ,其中n与len成反比(site.portal_catalog.uniqueValuesFor(indexnamehere))。对于大量结果,近似二次排序的正确性对于高变异性是高的,而对于低变异性是低的(具有相同次级值的许多项目,使得计数远大于批量大小可能使这令人沮丧)。
  4. 除非您正在处理特别大的结果集,否则不要进行优化。

    不言而喻:如果你做了优化,你需要验证你实际上是在获得更好的结果(配置文件和基准)。如果你不能证明投入时间来证明这一点,你就无法证明优化的合理性。