我的问题是找到最快的方法来获取最后一个(按时间戳)索引的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对索引中的所有文档进行排序,然后选择最顶层的文档。是否有我可以制作的搜索查询更适合此目的?
答案 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);
利润!!!