翼度科技»论坛 编程开发 .net 查看内容

在 Sitecore 里使用 Solr 搜索 SortOrder 关联的 Item

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
在 C# 使用 Solr 搜索

sitecore 的配置信息文件可直接丢进 \App_Config 下,sitecore 会自动检测配置文件更新并加载到内存中。
通常情况下,配置信息文件是放在 \App_Config\Include\ 下, 为你项目名。
通过配置启用 SortOrder 字段并获取 SortOrder

sitecore 默认是移除了 SortOrder 字段的,不过可通过打个补丁修改配置信息,如下配置 xml 启用 SortOrder 字段。
但是这种启用 SortOrder 字段有个不好的地方,当字段值为空时,在 Solr 里是找不到此字段的,且值类型为 string 类型。
EnableSortOrder_Patch.config
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
  3.   <system.web>
  4.   </system.web>
  5.   <sitecore>
  6.       <contentSearch>
  7.           <indexConfigurations>
  8.               <defaultSolrIndexConfiguration type="Sitecore.ContentSearch.SolrProvider.SolrIndexConfiguration, Sitecore.ContentSearch.SolrProvider">
  9.                   <documentOptions type="Sitecore.ContentSearch.SolrProvider.SolrDocumentBuilderOptions, Sitecore.ContentSearch.SolrProvider">
  10.                       <exclude hint="list:AddExcludedField">
  11.                           <__SortOrder>
  12.                               <patch:delete />
  13.                           </__SortOrder>
  14.                       </exclude>
  15.                   </documentOptions>
  16.               </defaultSolrIndexConfiguration>
  17.           </indexConfigurations>
  18.       </contentSearch>
  19.   </sitecore>
  20. </configuration>
复制代码
C# Code
  1. // ./SearchResultModel.cs
  2. using Sitecore.ContentSearch;
  3. public class SearchResultModel
  4. {
  5.     [IndexField(BuiltinFields.Name)]
  6.     public virtual string ItemName { get; set; }
  7.     // 注意此处需要填 SortOrder 的 Item name, 而不是 Title(通常在 sitecore 里直接看到就是 Title) 或者 Display Name
  8.     // 可通过它的 ID 找出证实一下 {BA3F86A2-4A1C-4D78-B63D-91C2779C1B5E}
  9.     // 或通过路径:/sitecore/templates/System/Templates/Sections/Appearance/Appearance/__Sortorder
  10.     [IndexField("__Sortorder")]
  11.     public virtual int SortOrder { get; set; }
  12.     [IndexField(BuiltinFields.Language)]
  13.     public virtual string Language { get; set; }
  14.     [IndexField(BuiltinFields.LatestVersion)]
  15.     [ScriptIgnore]
  16.     public virtual bool IsLatestVersion { get; set; }
  17. }
  18. // ----------------------------------------------
  19. // ./Sample.cs
  20. using Sitecore.ContentSearch;
  21. using Sitecore.Globalization;
  22. using Sitecore.ContentSearch.Linq.Utilities;
  23.    
  24. var indexName = "sitecore_web_index";
  25. var language = Sitecore.Globalization.Language.Parse("en");
  26. using (IProviderSearchContext context = ContentSearchManager.GetIndex(indexName))
  27. {
  28.     var predicate = PredicateBuilder.True<SearchResultModel>();
  29.     if (!Sitecore.Context.PageMode.IsNormal)
  30.         predicate = predicate.And(z => z.IsLatestVersion);
  31.     predicate = predicate.And(z => z.Language.Equals(language.Name, StringComparison.OrdinalIgnoreCase));
  32.     var query = context.GetQueryable<SearchResultModel>()
  33.         .Filter(predicate);
  34.     // sitecore 排序的规则为:先按 SortOrder 升序排序,再按 Item name 升序排序
  35.     query = query
  36.         .OrderBy(z => z.SortOrder)
  37.         .ThenBy(z => z.ItemName);
  38.     return query.Select(x => x.Item)?.GetResults().Hits.Select(z => z.Document);
  39. }
复制代码
*通过使用 IComputedIndexField 接口获取 SortOrder

此方法与前面不同的地方在于,当字段值为空时,在 Solr 里仍然可以搜索到此字段,且值为 100,同时值类型为 int 类型。推荐使用这种方式。
AddSortOrderField_Patch.config
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
  3.   <system.web>
  4.   </system.web>
  5.   <sitecore>
  6.     <contentSearch>
  7.       <indexConfigurations>
  8.         <defaultSolrIndexConfiguration type="Sitecore.ContentSearch.SolrProvider.SolrIndexConfiguration, Sitecore.ContentSearch.SolrProvider">
  9.           <documentOptions>
  10.             <fields hint="raw:AddComputedIndexField">
  11.               <field fieldName="SortOrder" returnType="int">LinkReit.Feature.Content.ChannelCard.ComputedFields.SortOrderField, LinkReit.Feature.Content.ChannelCard</field>
  12.             </fields>
  13.           </documentOptions>
  14.         </defaultSolrIndexConfiguration>
  15.       </indexConfigurations>
  16.     </contentSearch>
  17.   </sitecore>
  18. </configuration>
复制代码
C# Code
  1. // ./SortOrderField.cs
  2. using Sitecore.Data.Items;
  3. using Sitecore.ContentSearch;
  4. using Sitecore.ContentSearch.ComputedFields;
  5. public class SortOrderField : IComputedIndexField
  6. {
  7.     public object ComputeFieldValue(IIndexable indexable)
  8.     {
  9.         var item = (Item)(indexable as SitecoreIndexableItem);
  10.         if (item == null) return null;
  11.         
  12.         return item.Appearance.Sortorder;
  13.     }
  14.     public string FieldName { get; set; }
  15.     public string ReturnType { get; set; }
  16. }
  17. // ----------------------------------------------
  18. // ./SearchResultModel.cs
  19. using Sitecore.ContentSearch;
  20. public class SearchResultModel
  21. {
  22.     [IndexField(BuiltinFields.Name)]
  23.     public virtual string ItemName { get; set; }
  24.     // 此处 IndexFieldAttribute 构造参数需要填写的是你配置的 SortOrder 的 fieldName
  25.     [IndexField("SortOrder")]
  26.     public virtual int SortOrder { get; set; }
  27.     [IndexField(BuiltinFields.Language)]
  28.     public virtual string Language { get; set; }
  29.     [IndexField(BuiltinFields.LatestVersion)]
  30.     [ScriptIgnore]
  31.     public virtual bool IsLatestVersion { get; set; }
  32. }
  33. // ----------------------------------------------
  34. // ./Sample.cs
  35. using Sitecore.ContentSearch;
  36. using Sitecore.Globalization;
  37. using Sitecore.ContentSearch.Linq.Utilities;
  38.    
  39. var indexName = "sitecore_web_index";
  40. var language = Sitecore.Globalization.Language.Parse("en");
  41. using (IProviderSearchContext context = ContentSearchManager.GetIndex(indexName))
  42. {
  43.     var predicate = PredicateBuilder.True<SearchResultModel>();
  44.     if (!Sitecore.Context.PageMode.IsNormal)
  45.         predicate = predicate.And(z => z.IsLatestVersion);
  46.     predicate = predicate.And(z => z.Language.Equals(language.Name, StringComparison.OrdinalIgnoreCase));
  47.     var query = context.GetQueryable<SearchResultModel>()
  48.         .Filter(predicate);
  49.     // sitecore 排序的规则为:先按 SortOrder 升序排序,再按 Item name 升序排序
  50.     query = query
  51.         .OrderBy(z => z.SortOrder)
  52.         .ThenBy(z => z.ItemName);
  53.     return query.Select(x => x.Item)?.GetResults().Hits.Select(z => z.Document);
  54. }
复制代码
来源:https://www.cnblogs.com/fires/archive/2023/03/09/17198817.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具