Сортировка по полю даты с помощью Sitecore 7 ContentSearch

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

public static IEnumerable<Episode> GetPastEpisodes(Show show, bool includeMostRecent = false, int count = 0)
{
    IEnumerable<Episode> pastEpisodes;
    using (var context = _index.CreateSearchContext())
    {
        // querying against lucene index
        pastEpisodes = context.GetQueryable<Episode>().Where(GetPastAirDatePredicate(show));

        if(!includeMostRecent)
        {
            pastEpisodes = pastEpisodes.Where(item => item.Id != GetMostRecentEpisode(show).Id);
        }

        pastEpisodes = pastEpisodes.OrderByDescending(ep => ep.Latest_Air_Date);

        if (count > 0)
        {
            pastEpisodes = pastEpisodes.Take(count);
        }

        pastEpisodes = pastEpisodes.ToList();

        // map the lucene documents to Sitecore items using the database
        foreach (var episode in pastEpisodes)
        {
            _database.Map(episode);
        }

    }
    return pastEpisodes;
}

private static Expression<Func<Episode,bool>> GetPastAirDatePredicate(Show show)
{
    var templatePredicate = PredicateBuilder.Create<Episode>(item => item.TemplateId == IEpisodeConstants.TemplateId);
    var showPathPredicate = PredicateBuilder.Create<Episode>(item => item.FullPath.StartsWith(show.FullPath));
    var airDatePredicate = PredicateBuilder.Create<Episode>(item => item.Latest_Air_Date < DateTime.Now.Date.AddDays(1));

    var fullPredicate = PredicateBuilder.Create<Episode>(templatePredicate).And(showPathPredicate).And(airDatePredicate);

    return fullPredicate;
}

Поле сохраняется и не содержит токенов, а также с использованием LowerCaseKeywordAnalyzer.

<field fieldName="latest_air_date" storageType="YES" indexType="UN_TOKENIZED" vectorType="NO" boost="1f" type="System.DateTime" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider">
    <analyzer type="Sitecore.ContentSearch.LuceneProvider.Analyzers.LowerCaseKeywordAnalyzer, Sitecore.ContentSearch.LuceneProvider"/>
</field>

Класс эпизода имеет набор атрибутов IndexField:

[IndexField("latest_air_date")]
public virtual DateTime Latest_Air_Date  {get; set; }

person Kyle    schedule 26.06.2014    source источник
comment
Не могли бы вы изменить type=System.DateTime на type=System.String, а затем перестроить индекс и повторить попытку?   -  person Ahmed Okour    schedule 27.06.2014
comment
@AhmedOkour Не сработало, но спасибо.   -  person Kyle    schedule 27.06.2014
comment
Кайл, не могли бы вы подтвердить, на какой версии Sitecore вы это тестируете?   -  person Matt Gartman    schedule 27.06.2014
comment
только что заметил, что index type = 'UN_TOKENIZED', я думаю, что он должен быть indexType = untokenized.   -  person Ahmed Okour    schedule 29.06.2014
comment
У меня точно такая же проблема. Кайл, ты уже нашел решение?   -  person Pascal Mathys    schedule 15.11.2014
comment
@PascalMathys Я сейчас пытаюсь вспомнить. Я нашел решение. Я думаю, что проблема в моем случае заключалась в том, что «Latest_Air_Date» было полем вычисляемого индекса, и пользовательская логика, которую я использовал для вычисления значения этого поля, была ошибочной.   -  person Kyle    schedule 17.11.2014


Ответы (1)


Кайл,

Насколько я могу судить, все выглядит правильно с вашей конфигурацией и кодом. Я издевался над чем-то очень похожим в ванильном экземпляре Sitecore 7.2, и даты отсортировались без проблем.

Однако следует отметить одну вещь, и это может вызвать у вас некоторые проблемы, заключается в том, что FieldReader Sitecore для DateTime хранит только часть даты DateTime. Если вы ожидаете, что сможете сортировать по истинному DateTime, вам нужно будет добавить пользовательский FieldReader или некоторые вычисляемые поля.

См. этот блог, в котором обсуждается проблема и объясняется процесс замены пользовательского средства чтения полей: http://reasoncodeexample.com/2014/01/30/indexing-datetime-fields-sitecore-7-content-search/

Я бы также предложил посмотреть индекс с Люком, чтобы проверить, какие данные на самом деле находятся в индексе. https://code.google.com/p/luke/

И, наконец, вы можете включить отладку поиска в Sitecore, чтобы увидеть, как именно Sitecore выполняет запрос в Lucene.

Sitecore.ContentSearch.config:

<setting name="ContentSearch.EnableSearchDebug" value="true" />
person Matt Gartman    schedule 27.06.2014
comment
Цените советы. Я подтвердил, что значения сохраняются правильно с помощью Люка, и я просто смотрю на даты (а не на время). Git попробует отладить поиск. - person Kyle; 27.06.2014
comment
Кайл, отладка поиска выдает много информации, не стесняйтесь добавлять этот вывод, и я могу сравнить с тем, что вижу на своей стороне. - person Matt Gartman; 27.06.2014