[英]Sitecore 7: Sorting Lucene results by field
我们试图通过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。 但无法弄清楚在哪里配置它。 似乎没有提供任何添加选项的地方。
欢迎任何帮助,谢谢!
你是对的,如果你排序最好的话,字段不会被标记为,如果你有空格等,它会将它分解成小标记并对它们进行排序。
您可以将自定义分析器指定为fieldMap
部分中field
元素的子元素。例如
<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起有效)
对我有用的是在where子句后添加.ToList
var query = context.GetQueryable<ContentSearchResultItem>()
.Where(x => x.Title == "New York")
.ToList()
.OrderBy(x => x.TitleForSorting);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.