2016-08-03 41 views
0

Mein Problem ist es, den schnellsten Weg zu finden, um das letzte (zeitstempelweise) indizierte Lucene-Dokument zu erhalten.Lucene.NET holt das zuletzt indizierte Dokument

Hier ist, was die Felder in dem Dokument wie folgt aussehen:

 // 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); 

Derzeit nehme ich an eine tragfähige Lösung ist durch die timestampField der Dokumente, alle Dokumente im Index zu sortieren und nur die oberste holen. Kann ich eine Suchanfrage stellen, die für diesen Zweck besser geeignet wäre?

+0

warum möchte man das machen? – Mysterion

+0

Nun, wenn ich eine Nachricht indexiere, möchte ich die TF-IDF der Nachricht mit der vorherigen vergleichen. Dazu benötige ich die Dokument-ID der vorherigen Nachricht, die in den Index eingefügt wurde. Daher glaube ich, dass eine Suche notwendig ist, da es keine Garantien für die Lucene Dokumenten ID gibt. –

Antwort

1

Es gibt ein paar Optionen.

Stellen Sie zunächst sicher, dass das Feld "timestamp" sortierbar ist. ToString() ist kultursensitiv und daher nicht garantiert bestellbar. ToString ("o") ist in Ordnung, aber ...

Ich würde lieber ein numerisches Feld verwenden und DateTime.UtcNow() einfügen. Zecken Sie es ein. (Verwenden .SetLongValue (Zecken))

Dann

  • eine Sort für das Feld absteigend geordnet. So etwas wie

    var sort = new Sort(new SortField(TimestampFieldName, SortField.LONG, true)) 
    
  • Verwenden Sie den Sucher für die ein Sammler nimmt (man beachte die "1" in der .Create line = nur zurückgeben ein Maximum von einem Ergebnis)

    var collector = TopFieldCollector.Create(sort, 1, false, trackScores, trackScores, trackScores); 
    searcher.Search(query, filter, collector); 
    var topdocs = collector.TopDocs(); 
    
  • Holen Sie sich das Dokument

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