Lucene.NET - сортировка по int - PullRequest
9 голосов
/ 21 апреля 2010

В последней версии Lucene (или Lucene.NET), как правильно вернуть результаты поиска в отсортированном порядке?

У меня есть такой документ:

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

Теперь я хочу выполнить поиск и вернуть результаты в порядке самых последних.

Как мне выполнить поиск, упорядочивающий результаты по CreationDate? Вся документация, которую я вижу, относится к старым версиям Lucene, которые используют устаревшие API.

1 Ответ

11 голосов
/ 21 апреля 2010

Проведя некоторые исследования и изучив API, я наконец-то нашел несколько устаревших API (начиная с v2.9 и v3.0), которые позволят вам сделать заказ по дате:

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

Примечание. Я сортирую дату создания с помощью ДОЛГОГО сравнения.Это потому, что я сохраняю дату создания как DateTime.Now.Ticks, которая является System.Int64 или длинной в C #.

...