【问题标题】:Is it possible to sort Lucene search results by creation sequence/date?是否可以按创建顺序/日期对 Lucene 搜索结果进行排序?
【发布时间】:2016-03-23 19:14:41
【问题描述】:

简单直接的问题: 是否可以根据创建顺序/日期对搜索结果进行排序?添加日期字段并按其排序是一种选择。 但是,索引已经存在,并且包含大量我想要排序(一些)的文档。

【问题讨论】:

  • AFAIK Lucene 不在索引中存储创建日期。但是文件编号不是连续的吗? (我刚查过,他们aren't necessarily
  • 不知道这个事实。那么我们可以假设默认结果集按 doc id 顺序排列吗?
  • 啊,据我了解,这些 id 不是唯一的,特别是在多个索引中使用时。但最有可能确保一致的创建顺序。我要多挖一点。
  • 是的,无论想象如何,它都不是完美的。显然,确切的解决方案是为每个文档加上时间戳,但对于“足够接近”的解决方案,可能会出现取决于文档 ID 的某些内容。但是您需要弄清楚在段合并和其他维护任务期间文档 ID 会发生什么。
  • 从战壕中:用户没有意识到 Lucene 有多棒。一旦他们看到它,每隔几周就会出现新的要求,我最终为 150 万份文档重新索引了 3 次。也许只是添加索引日期字段并重新索引是处理它的最佳方法 - 在确保他们还没有准备好在你身上弹出其他东西之后。您可以在创建新索引时通过搜索现有索引来屏蔽用户。

标签: lucene lucene.net


【解决方案1】:

不要将 docID 用于任何事情(除了在查询后获取 doc)。它不是连续的,如果您进行更新(实际上是删除然后添加),它不一定是稳定的。

只需在查询中添加一个表示日期的字段并按该字段排序。

将其设为数字​​字段并将数字格式设置为 yyyyMMddhhmmss。如果您需要较少的精度,只需从右侧删除一些数字。或者,如果您想要更好的精度,只需存储刻度值。

扩展方法 FTW!

    public static long AsYMDHMS(this DateTime date)
    {
        return
            (date.Year * 10000000000) +
            (date.Month * 100000000) +
            (date.Day * 1000000) +
            (date.Hour * 10000) +
            (date.Minute * 100) +
            date.Second;
    }

【讨论】:

    猜你喜欢
    • 2018-04-25
    • 1970-01-01
    • 2011-03-05
    • 2013-08-19
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    相关资源
    最近更新 更多