订购Sitecore搜索结果

时间:2016-02-29 23:27:53

标签: sitecore sitecore7.2

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

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

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

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

以上命令不起作用。显然,我不能将Sitecore扩展方法与IQueryable一起使用?

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

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

有没有一种简洁快捷的解决方法?

干杯

2 个答案:

答案 0 :(得分:0)

我认为您只需要将您的字段添加到SearchResultItem并将其标记为int。我假设该字段是一个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

答案 1 :(得分:0)

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

  

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

     

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

您在问题和评论中存在冲突。如果您希望结果优先,然后是用户选择的结果,则以下内容将起作用:

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

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

query = dataQuery.OrderByDescending(i => i["Priority"]).ThenByDescending(i => i.Title);

如果您只是想通过它排序,则不必将该字段添加到SearchResultItem,只有当您需要返回该字段的实际值时才会这样。

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

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