Sitecore 7: Сортировка результатов Lucene по полю

Мы пытаемся отсортировать результаты Lucene по полю заголовка.

Из того, что я понимаю из Lucene, это требует, чтобы поле было NOT_ANALYZED.

Из того, что я прочитал на форуме, это также требует от нас использования LowerCaseKeywordAnalyzer. ( здесь)

Я не могу понять, как собрать все это вместе, вот что у меня сейчас, и сортировка не работает:

В Sitecore.ContentSearch.Lucene.DefaultIndexConfiguration:

<fields hint="raw:AddCustomField">
  <!--...-->
  <field luceneName="titleForSorting"     storageType="yes" indexType="untokenized">Title</field>
</fields>

Наш класс результатов поиска:

public class ContentSearchResultItem : SearchResultItem
{
    public virtual string Title { get; set; }

    [IndexField("titleForSorting")] 
    public virtual string TitleForSorting { get; set; }
}

Наша поисковая реализация:

using (var context = ContentSearchManager.GetIndex(Context.Indexname).CreateSearchContext())
{
    var query = context.GetQueryable<ContentSearchResultItem>()
        .Where(x => x.Title == "New York")
        .OrderBy(x => x.TitleForSorting);

    var searchResult = query.GetResults();
    var hitsQuery = searchResult.Hits;

    // Or sort here ??
    // hitsQuery = hitsQuery.OrderBy(x => x.Document.TitleForSorting);

    var results = hitsResults.Select(x => x.Document).ToArray();
}

Как уже говорилось, я также читал, что мы должны использовать LowerCaseKeywordAnalyzer. Но не могу понять, где это настроить. Кажется, нет места для добавления опции.

Любая помощь приветствуется, спасибо!

2 ответа

Решение

Вы правы, если вы сортируете лучше всего, поле не размечено, как, если у вас есть пробелы и т.д., оно разбивает его на маленькие токены и сортирует по ним.

Вы можете указать собственный анализатор как дочерний элемент field элемент в fieldMap раздел.. например

<fieldNames hint="raw:AddFieldByFieldName">
   <field fieldName="titleForSorting" storageType="YES" indexType="UN_TOKENIZED"    vectorType="NO" boost="1f" type="System.String" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider">
       <analyzer type="Sitecore.ContentSearch.LuceneProvider.Analyzers.LowerCaseKeywordAnalyzer, Sitecore.ContentSearch.LuceneProvider" />
   </field>
   ...
</fields>

(Это действительно с Sitecore 7.0 rev. 130918)

Что работает для меня, это добавить .ToList после предложения where

var query = context.GetQueryable<ContentSearchResultItem>()
        .Where(x => x.Title == "New York")
        .ToList()
        .OrderBy(x => x.TitleForSorting);
Другие вопросы по тегам