【问题标题】:Ordering Sitecore search results订购 Sitecore 搜索结果
【发布时间】:2016-06-13 05:11:30
【问题描述】:

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

在调用 GetResults() 之前,我想根据字段的 (Fieldname - 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

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

干杯

【问题讨论】:

  • I apply the filtering and sorting on this search object - 您是否按多个字段排序?例如标题和优先级?
  • @jammykam - 是的。我首先根据用户选择的标准对它们进行排序 - 例如名称、创建日期等。一旦我得到结果,我需要按优先级字段对它们进行排序。
  • 你是分页结果还是得到结果后才能下单?
  • 我正在分页结果@dnstommy
  • 嗯,好的。下面的结果有效吗?我知道 Lucene 将所有内容都视为字符串。使用 int 很痛苦。

标签: sitecore sitecore7.2


【解决方案1】:

您可以将OrderByDescendingThenByDescending 结合使用,使用多个字段对搜索结果进行排序。因此,您需要先按优先级排序,然后再按 [Name|Date|Whatever]。

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

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

您在问题和 cmets 中自相矛盾。如果您想要优先的结果,然后是用户选择的结果,那么以下将起作用:

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找到更多信息。

【讨论】:

  • 对不起,如果我的问题看起来令人困惑。我会再重复一遍。我首先根据用户选择的标准对它们进行排序,然后在优先级字段中对它们进行排序。我无法使用“优先级”字段进行订购。我得到的错误是Ordering can only be done on 'Sitecore.ContentSearch.Linq.Nodes.FieldNode'.
  • 您是否更新了搜索配置以同时索引优先级字段?
  • 该字段已映射。
  • 发布字段映射的配置
【解决方案2】:

我认为您只需将字段添加到 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多