2016-08-03 3 views
0

내 문제는 마지막 (타임 스탬프 와이즈) 인덱싱 된 Lucene 문서를 얻는 가장 빠른 방법을 찾는 데 있습니다. Lucene.NET에서 가장 최근에 인덱싱 된 문서 가져 오기

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

이유는 무엇입니까? – Mysterion

+0

글자를 색인 할 때마다 메세지의 TF-IDF를 이전 메세지와 비교하려고합니다. 그렇게하기 위해서는 색인에 삽입 된 이전 메시지의 문서 ID가 필요합니다. 따라서 Lucene 문서 ID에 대한 보장이 없기 때문에 검색이 필요하다고 생각합니다. –

답변

1

두 가지 옵션이 있습니다.

먼저 "타임 스탬프"필드가 정렬 가능해야합니다. ToString()은 문화에 민감하므로 주문할 수 있다고 보장 할 수 없습니다. ToString ("o")은 괜찮지 만 ...

숫자 필드를 사용하고 DateTime.UtcNow()를 넣는 것을 선호합니다. 해당 필드는 내림차순으로 정렬을 위해

  • 가 정렬을 만들 다음

    (.SetLongValue (틱)를 사용). 그 수집가 소요에 대한

    var sort = new Sort(new SortField(TimestampFieldName, SortField.LONG, true)) 
    
  • 같은 뭔가가 문서를 가져옵니다

    var collector = TopFieldCollector.Create(sort, 1, false, trackScores, trackScores, trackScores); 
    searcher.Search(query, filter, collector); 
    var topdocs = collector.TopDocs(); 
    
  • (이하 "1".Create 라인 = 하나 개의 결과 만의 최대를 돌려 주) 수색자를 사용

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

관련 문제