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

时间:2016-08-03 23:01:44

标签: c# .net lucene lucene.net

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

目前我假设一个可行的解决方案是通过文档的timestampField对索引中的所有文档进行排序,然后选择最顶层的文档。是否有我可以制作的搜索查询更适合此目的?

1 个答案:

答案 0 :(得分:2)

有几种选择。

首先,确保您的"时间戳"字段是可排序的。 ToString()对文化很敏感,所以不能保证可订购。 ToString(" o")没问题,但......

我更喜欢使用数字字段并放入DateTime.UtcNow()。请点击它。 (使用.SetLongValue(ticks))

然后,

  • 为按降序排序的字段创建排序。像

    这样的东西
    var sort = new Sort(new SortField(TimestampFieldName, SortField.LONG, true))
    
  • 使用搜索器收集收集器(注意" 1"在.Create行中=仅返回最多一个结果)

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