OrderBy 排序不正确

OrderBy does not order correctly

我有以下查询


var predicate = PredicateBuilder.True<SearchModel>();
            predicate = predicate.And(x => (templateIDs.Contains(x.TemplateId))); // To match certain templates only


var products = searchContext.GetQueryable() 
                                           .Where(predicate)
                                           .OrderBy(i => i.Title) //will order the items by display 
                                           .Take(pageSize); //pageSize is passed through and is an integer
                                           .GetResults(); 

我从来没有得到按字母顺序排列的结果。

但是,如果我执行以下操作,则结果排序正确。

var fullResults = searchResults.ToList().OrderBy(x=>x.Title).Take(pageSize); //pageSize is passed through and is an integer

有人知道为什么吗?

如果我用第二种方式 (.ToList().OrderBy().Take().),它会对性能产生影响吗,因为我相信结果会在结果出现后进行排序和分页从 Solr 获取?

在 Solr 中排序可能有点混乱。从历史上看,在 Solr 的 ContentSearch 提供程序中也存在一些排序问题,其中 orderby 子句被反转等。假设您使用的是相当新的 Sitecore 版本,据我所知,这些问题已得到修复。为了查明您的问题所在,您应该查看 search.log 并验证谓词 builder/content 搜索是否确实执行了您期望的查询。

鉴于以上内容没问题,您可能对 Solr 的工作原理存在普遍的误解。我猜您的 Title 字段被索引为“文本”字段,例如 title_t_en,而不是 string 字段。文本字段在存储在 Solr 中之前被标记化和词干化。因此,将对标记化的术语而不是整个字符串执行排序。这意味着文本,例如“The quick brown fox jumps over the lazy dog”,将被词干化为 ["quick", "brown", "fox", "jump", "over", "lazy", "dog"] 和 order by 语句将按 "brown" 排序。这可能会导致排序看起来非常错误,因为结果可能不会按字符串中的第一个单词排序。

解决此问题的一种方法是将标题字段的副本保存到 title_s 字段中。您可以使用 solr 模式中的复制语句来执行此操作,或者如果您想保持模式不变,您可以将计算字段映射为字符串。因此,您可以在词干文本字段上执行语言文本查询,并在字符串字段上对结果进行排序。