2016-02-29 140 views
1

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

在我打电话给GetResults()之前,我想根据该字段的一个字段(字段名称 - Priority)值排序结果。因此,对于IQueryable<T>对象中的所有项目,我想按优先级字段对它们进行排序,因此所有具有该字段值的项目都保留在顶部,剩下的项目位于底部。

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

search.OrderByDescending(i => !string.IsNullOrEmpty(i.GetItem().GetFieldValue("Priority"))) 

上述命令不起作用。显然,我不能使用IQueryable的Sitecore扩展方法?如果我转换search.ToList()。做排序,然后将其转换回AsQueryable(),我得到以下错误:

There is no method 'GetResults' on type 'Sitecore.ContentSearch.Linq.QueryableExtensions' 
that matches the specified arguments 

是否有一个整洁,快捷的方式来解决这个问题?

干杯

+0

'我对这个搜索对象应用过滤和排序' - 你是通过多个字段排序的吗?例如标题和优先权? – jammykam

+0

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

+0

您是分页结果还是可以在获得结果后订购? –

回答

0

我想你只需要你的字段添加到您的SearchResultItem并将其标记为一个int。我正在假设该字段是一个整数。制作一个继承SearchResultItem的自定义类。

public class CustomSearchResultItem : SearchResultItem 
{ 
    [IndexField("Priority")] 
    public int Priority { get; set; } 
} 

然后在您的搜索中使用它。最后点它。

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

您可以通过使用OrderByDescendingThenByDescending联合使用多个字段搜索结果进行排序。因此,您需要先按优先顺序排序,然后按[名称|日期|随时]排序。

I want to order them desc by Priority field, so all the items which has a value for that field stay at the top and the rest are at the bottom.

I sort them first on the criteria chosen by the user - like Name, Date created etc. Once I get the results back, I need to order them by priority field

你在自己的问题和意见中存在矛盾。如果你想优先的结果,然后再由用户选择的结果的话,下面的工作:

query = dataQuery.OrderByDescending(i => i.Title).ThenByDescending(i => i["Priority"]); 
var results = query.GetResults().Hits.Select(h => h.Document); 

有在Sitecore的早期版本,这意味着该ThenBy条款将OrderBy句之前,因此加入一个bug它在上面反向添加。您可能需要检查这是否在当前版本中修复。如果是这样简单地改变你的查询:

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

对不起,如果我的问题似乎令人困惑。我将重新迭代。我首先根据用户选择的标准对它们进行排序,然后在优先领域对它们进行排序。我无法使用Priority字段进行排序。我得到的错误是'只能在'Sitecore.ContentSearch.Linq.Nodes.FieldNode'上完成订购。' – NomadTraveler

+0

您是否更新了搜索配置以同时为优先级字段编制索引? – jammykam

+0

该字段已映射。 – NomadTraveler