Lucene.NET 获取最近索引的文档

Lucene.NET getting the most recently indexed document

我的问题是找到最快的方法来获取最后一个(按时间戳)索引的 Lucene 文档。

文档中的字段如下所示:

        // Index file contents
        Field contentField = new Field(
            FieldContent, 
            message.content,
            Field.Store.YES, 
            Field.Index.ANALYZED, 
            Field.TermVector.YES);

        // The id of the document
        Field messageIdField = new Field(
            FieldMessageId,
            message.serverMessageId,
            Field.Store.YES,
            Field.Index.NOT_ANALYZED);

        // The dateTime that the document was created
        Field timeStampField = new Field(
            FieldTimeStamp,
            message.creationDate.ToString(),
            Field.Store.YES,
            Field.Index.NOT_ANALYZED);

目前我假设一个可行的解决方案是按文档的时间戳字段对索引中的所有文档进行排序,然后只选择最前面的一个。是否有我可以进行的搜索查询,哪个更适合此目的?

有几个选项。

首先,确保您的 "timestamp" 字段是可排序的。 ToString() 对文化敏感,因此不保证可以订购。 ToString("o") 没问题,但是...

我更愿意使用数字字段并将 DateTime.UtcNow().Ticks 放入其中。 (使用 .SetLongValue(ticks) )

然后,

  • 为该字段创建一个降序排序。像

    var sort = new Sort(new SortField(TimestampFieldName, SortField.LONG, true))
    
  • 使用搜索器获取一个收集器(注意 .Create 行中的“1”= 仅 return 最多一个结果)

    var collector = TopFieldCollector.Create(sort, 1, false, trackScores, trackScores, trackScores);
    searcher.Search(query, filter, collector);
    var topdocs = collector.TopDocs();
    
  • 获取文档

    var topdoc = topDocs.ScoreDocs[0];
    var doc = container.Document(topdoc.Doc);
    
  • 利润!!!