排序Sitecore搜索结果

排序Sitecore搜索结果,sitecore,sitecore7.2,Sitecore,Sitecore7.2,我有一个IQueryable对象作为搜索结果对象。 我在此搜索对象上应用筛选和排序 在调用GetResults()之前,我想根据字段的一个(Fieldname-Priority)值对结果进行排序。因此,对于IQueryable对象中的所有项目,我想按优先级字段对它们进行排序,因此所有具有该字段值的项目都位于顶部,其余项目位于底部 我有优先级字段的fieldmap条目 search.OrderByDescending(i => !string.IsNullOrEmpty(i.GetItem(

我有一个
IQueryable
对象作为搜索结果对象。 我在此搜索对象上应用筛选和排序

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

我有优先级字段的
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
有没有一个简单快捷的方法来解决这个问题


干杯

我认为您只需要将字段添加到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);
}
使用(var context=ContentSearchManager.GetIndex(“sitecore\u master\u index”).CreateSearchContext())
{
var results=context.GetQueryable().Where(prod=>prod.Content.Contains(“搜索框文本”).OrderByDescending(t=>t.Priority);
}
这里有一些数据


我认为您只需要将字段添加到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);
}
使用(var context=ContentSearchManager.GetIndex(“sitecore\u master\u index”).CreateSearchContext())
{
var results=context.GetQueryable().Where(prod=>prod.Content.Contains(“搜索框文本”).OrderByDescending(t=>t.Priority);
}
这里有一些数据


您可以通过使用
OrderByDescending
ThenByDescending
组合使用多个字段对搜索结果排序。因此,您需要按优先级排序,然后按[Name | Date | Whatever]排序

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

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

您在问题和评论中与自己存在冲突。如果您希望结果具有优先级,然后是用户选择的结果,则以下操作将起作用:

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[“用户选择的任何字段”]
,而不是
i.Title


您可以在中找到更多信息。

您可以使用
OrderByDescending
ThenByDescending
组合使用多个字段对搜索结果排序。因此,您需要按优先级排序,然后按[Name | Date | which]排序

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

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

您在问题和评论中与自己存在冲突。如果您希望结果具有优先级,然后是用户选择的结果,则以下操作将起作用:

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[“用户选择的任何字段”]
,而不是
i.Title


你可以在中找到更多信息。

我对这个搜索对象应用过滤和排序
-你是按多个字段排序吗?例如标题和优先级?@jammykam-排序是的。我首先根据用户选择的标准排序,如名称、创建日期等。一旦我得到结果,我需要按优先级字段排序。你是吗分页结果或者你能在得到结果后排序吗?我是分页结果@dnstommyAhh好的。下面的结果有效吗?我知道Lucene将所有东西都视为字符串。使用int是一件痛苦的事情。
我对这个搜索对象应用筛选和排序
-你是按多个字段排序吗?例如标题和优先级?@jammykam-排序是的。我首先根据用户名、创建日期等用户选择的标准对它们进行排序。一旦我得到结果,我需要按照优先级字段对它们进行排序。你是分页结果还是可以在得到结果后进行排序?我是分页结果@dnstommyAhh ok。下面的结果有效吗?我知道Lucene将所有内容都视为字符串。使用int是一种pa在中。很抱歉,如果我的问题令人困惑。我将重新迭代。我首先根据用户选择的标准对它们进行排序,然后在优先级字段中对它们进行排序。我无法使用优先级字段进行排序。我得到的错误是
排序只能在'Sitec'上进行