4

我们正在尝试按 Title 字段对 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。但无法弄清楚在哪里配置它。似乎没有提供任何添加选项的地方。

欢迎任何帮助,谢谢!

4

2 回答 2

4

你是对的,如果你对它进行最好的排序,那么该字段不会被标记为,如果你有空格等,它会将它分解成小标记并对其进行排序。

您可以将自定义分析器指定为部分中元素的子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 起有效)

于 2013-10-04T10:17:32.547 回答
1

对我有用的是在 where 子句之后添加.ToList

var query = context.GetQueryable<ContentSearchResultItem>()
        .Where(x => x.Title == "New York")
        .ToList()
        .OrderBy(x => x.TitleForSorting);
于 2015-10-23T12:30:05.423 回答