首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >对Sitecore搜索结果进行排序

对Sitecore搜索结果进行排序
EN

Stack Overflow用户
提问于 2016-03-01 07:27:53
回答 2查看 1.3K关注 0票数 1

我有一个IQueryable<T>对象作为搜索结果对象。我在这个搜索对象上应用了过滤和排序。

在调用GetResults()之前,我想根据字段的一个(Fieldname - Priority)值对结果进行排序。因此,对于IQueryable<T>对象中的所有项,我希望按优先级字段对它们进行排序,以便所有具有该字段值的项都位于顶部,其余项位于底部。

我有优先级字段的fieldmap条目。

代码语言:javascript
代码运行次数:0
运行
复制
search.OrderByDescending(i => !string.IsNullOrEmpty(i.GetItem().GetFieldValue("Priority")))

上述命令不起作用。显然,我不能在IQueryable中使用Sitecore扩展方法?

如果我转换search.ToList()。进行排序,然后将其转换回AsQueryable(),我得到以下错误:

代码语言:javascript
代码运行次数:0
运行
复制
There is no method 'GetResults' on type 'Sitecore.ContentSearch.Linq.QueryableExtensions' 
that matches the specified arguments

有没有一种简单快捷的方法来解决这个问题呢?

干杯

EN

回答 2

Stack Overflow用户

发布于 2016-03-01 08:52:57

我认为你只需要将你的字段添加到你的SearchResultItem中,并将它标记为一个整型。我假设该字段是一个int类型。创建一个继承SearchResultItem的自定义类。

代码语言:javascript
代码运行次数:0
运行
复制
public class CustomSearchResultItem : SearchResultItem
{
    [IndexField("Priority")]
    public int Priority { get; set; }
}

然后在你的搜索中使用它。最后按它排序。

代码语言:javascript
代码运行次数:0
运行
复制
using (var context = ContentSearchManager.GetIndex("sitecore_master_index").CreateSearchContext())
{
    var results = context.GetQueryable<CustomSearchResultItem>().Where(prod => prod.Content.Contains("search box text").OrderByDescending(t => t.Priority);
}

在这里找到了一些数据。

http://www.sitecore.net/learn/blogs/technical-blogs/sitecore-7-development-team/posts/2013/10/sorting-and-ordering-results.aspx

票数 0
EN

Stack Overflow用户

发布于 2016-03-01 20:51:15

通过结合使用OrderByDescendingThenByDescending,您可以使用多个字段对搜索结果进行排序。因此,您需要先按优先级排序,然后再按名称|日期|其他值排序。

我想按优先级字段对它们进行排序,所以所有具有该字段的值的项目都留在顶部,其余的在底部。

我首先根据用户选择的标准对它们进行排序-例如名称、创建日期等。一旦我得到结果,我需要按优先级字段对它们进行排序

你在问题和评论中自相矛盾。如果您想要优先的结果,然后按用户选择的结果,那么下面的方法是可行的:

代码语言:javascript
代码运行次数:0
运行
复制
query = dataQuery.OrderByDescending(i => i.Title).ThenByDescending(i => i["Priority"]);
var results = query.GetResults().Hits.Select(h => h.Document);

在早期版本的Sitecore中有一个错误,这意味着ThenBy子句将被添加到OrderBy子句之前,因此它是在上面反向添加的。您可能希望检查此问题是否已在当前版本中修复。如果是这样,只需将您的查询更改为:

代码语言:javascript
代码运行次数:0
运行
复制
query = dataQuery.OrderByDescending(i => i["Priority"]).ThenByDescending(i => i.Title);

如果只想按字段排序,则不必将该字段添加到SearchResultItem中,只有在需要将该字段的实际值返回到的情况下才可以。

如果您需要按用户提供的自定义值进行排序,那么您可以传入i => i["whatever-field-the-user-has-selected"]而不是i.Title

你可以在this blog post上找到更多信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35711820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档