2010-04-21 30 views
9

En la última versión de Lucene (o Lucene.NET), ¿cuál es la forma correcta de volver a ordenar los resultados de búsqueda en orden?Lucene.NET - ordenando por int

Tengo un documento como este:

var document = new Lucene.Document(); 
document.AddField("Text", "foobar"); 
document.AddField("CreationDate", DateTime.Now.Ticks.ToString()); // store the date as an int 

indexWriter.AddDocument(document); 

Ahora quiero hacer una búsqueda y conseguir mis resultados de nuevo en el orden de más reciente.

¿Cómo puedo hacer una búsqueda que ordene los resultados por CreationDate? Toda la documentación que veo es para versiones antiguas de Lucene que usan API ahora en desuso.

Respuesta

11

Después de hacer algunas investigaciones y hurgando con la API, he encontrado por fin algunas API no desaprobado (a partir de v2.9 y v3.0) que le permitirá ordenar por fecha:

// Find all docs whose .Text contains "hello", ordered by .CreationDate. 
var query = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "Text", new StandardAnalyzer()).Parse("hello"); 
var indexDirectory = FSDirectory.Open(new DirectoryInfo("c:\\foo")); 
var searcher = new IndexSearcher(indexDirectory, true); 
try 
{ 
    var sort = new Sort(new SortField("CreationDate", SortField.LONG)); 
    var filter = new QueryWrapperFilter(query); 
    var results = searcher.Search(query, , 1000, sort); 
    foreach (var hit in results.scoreDocs) 
    { 
     Document document = searcher.Doc(hit.doc); 
     Console.WriteLine("\tFound match: {0}", document.Get("Text")); 
    } 
} 
finally 
{ 
    searcher.Close(); 
} 

Nota Estoy ordenando la fecha de creación con la comparación LONG. Eso es porque almaceno la fecha de creación como DateTime.Now.Ticks, que es un System.Int64, o largo en C#.

+3

primera solución comprensible para ordenar en Lucene que he encontrado – kevinsky

+0

Creo que falta un nulo para el filtro en el buscador. Método de búsqueda() llama ... – Ryan

+1

Creo que has cambiado 'CreationDate' a' CreationTime' ... –