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

本文关键字:索引 文档 最近 获取 NET Lucene | 更新日期: 2023-09-27 18:00:10

我的问题是找到最快的方法来获得最后一个(按时间戳)索引的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);

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

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

有几个选项。

首先,确保您的"时间戳"字段是可排序的。ToString()是区分区域性的,因此不能保证是可订购的。ToString("o")可以,但是。。。

我更喜欢使用数字字段,并在其中放入DateTime.UtcNow().Ticks。(使用.SetLongValue(Ticks))

然后,

  • 为该字段创建降序排序。类似的东西

    var sort = new Sort(new SortField(TimestampFieldName, SortField.LONG, true))
    
  • 使用Searcher获取收集器(注意.Create行中的"1"=最多只返回一个结果)

    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);
    
  • 利润!!!