【问题标题】:OrderBy does not order correctlyOrderBy 未正确订购
【发布时间】:2022-01-20 16:58:51
【问题描述】:

我有以下问题


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 sitecore


    【解决方案1】:

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

    鉴于上述情况没问题,您可能对 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 架构中的复制语句来执行此操作,或者如果您想保持架构不变,您可以将计算字段映射为字符串。因此,您可以对词干文本字段执行语言文本查询,并在字符串字段上对结果进行排序。

    【讨论】:

    • 成功了,谢谢!
    猜你喜欢
    • 2020-01-28
    • 2015-06-19
    • 2015-09-30
    • 2023-03-03
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多