Как я могу найти lucene.net с функцией сортировки? - PullRequest
2 голосов
/ 31 марта 2011

Я не уверен, что, как я могу использовать это с сортировкой.Я хочу отсортировать результат по дате и времени по убыванию.

1 Ответ

7 голосов
/ 31 марта 2011

ОБНОВЛЕНИЕ (2013.04.22): Более новые версии Lucene.NET позволяют сортировать по DateTime более напрямую, например:

var sort = new Sort( new SortField( Constants.LuceneCreationTime, SortField.LONG, true ) );
var filter = new QueryWrapperFilter( query );
var docs = searcher.Search( query, filter, 100, sort )

Добавьте CreationTime как DateTime.Ticks, чтобы разрешить его поиск через SortField.LONG.

Я проверил это с версией 3.0.


Да, на этот вопрос частично уже был дан ответ. Однако я хотел бы добавить примечание к части DateTime.

В обычных сообществах Lucene рекомендуется разделять DateTime, чтобы сделать их производительными и / или достаточно точными (Int32 - всего 10 символов). Я тестировал до 500 000 документов полгода назад, и, насколько я помню, это действительно был единственный эффективный способ, которым я мог придумать.

В любом случае, вы можете попробовать что-то вроде этого:

Индексация

var indexWriter = OpenWritableIndex();
Document doc = new Document();

DateTime lastEdited = DateTime.Now;
int year = lastEdited.Year;
int month = lastEdited.Month;
int day = lastEdited.Day;
int hour = lastEdited.Hour;
int minute = lastEdited.Minute;

doc.Add(new Field("LastEditedYear", year.ToString(), Field.Store.YES, Field.Index.UN_TOKENIZED));
doc.Add(new Field("LastEditedMonth", month.ToString(), Field.Store.YES, Field.Index.UN_TOKENIZED));
doc.Add(new Field("LastEditedDay", day.ToString(), Field.Store.YES, Field.Index.UN_TOKENIZED));
doc.Add(new Field("LastEditedHour", hour.ToString(), Field.Store.YES, Field.Index.UN_TOKENIZED));
doc.Add(new Field("LastEditedMinute", minute.ToString(), Field.Store.YES, Field.Index.UN_TOKENIZED));

indexWriter.AddDocument(doc);   

Поиск

var readableIndex = OpenReadableIndex();
var searcher = new IndexSearcher(readableIndex.Directory);
var multiParser = new MultiFieldQueryParser(termsToSearchIn, readableIndex.Analyzer);

var query = multiParser.Parse(terms);
Hits hits = null;
Sort sort = new Sort(new SortField[]
{
    new SortField("LastEditedYear", true),
    new SortField("LastEditedMonth", true),
    new SortField("LastEditedDay", true),
    new SortField("LastEditedHour", true),
    new SortField("LastEditedMinute", true)
}); 
if(sort != null)
{
    try
    {
        hits = searcher.Search(query, sort);
    }
    catch(SystemException) // Lucene throws a SystemException when trying to sort an empty response.
    {
        return new List<string>();
    }
}
...