在 Sitecore 里使用 Solr 搜索 SortOrder 關聯的 Item

来源:https://www.cnblogs.com/fires/archive/2023/03/09/17198817.html
-Advertisement-
Play Games

在 C# 使用 Solr 搜索 sitecore 的配置信息文件可直接丟進 <Instance>\App_Config 下,sitecore 會自動檢測配置文件更新並載入到記憶體中。 通常情況下,配置信息文件是放在 <Instance>\App_Config\Include\<Project> 下,< ...


在 C# 使用 Solr 搜索

sitecore 的配置信息文件可直接丟進 <Instance>\App_Config 下,sitecore 會自動檢測配置文件更新並載入到記憶體中。
通常情況下,配置信息文件是放在 <Instance>\App_Config\Include\<Project> 下,<Project> 為你項目名。


通過配置啟用 SortOrder 欄位並獲取 SortOrder

sitecore 預設是移除了 SortOrder 欄位的,不過可通過打個補丁修改配置信息,如下配置 xml 啟用 SortOrder 欄位。
但是這種啟用 SortOrder 欄位有個不好的地方,當欄位值為空時,在 Solr 里是找不到此欄位的,且值類型為 string 類型。

EnableSortOrder_Patch.config
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
  <system.web>
  </system.web>
  <sitecore>
      <contentSearch>
          <indexConfigurations>
              <defaultSolrIndexConfiguration type="Sitecore.ContentSearch.SolrProvider.SolrIndexConfiguration, Sitecore.ContentSearch.SolrProvider">
                  <documentOptions type="Sitecore.ContentSearch.SolrProvider.SolrDocumentBuilderOptions, Sitecore.ContentSearch.SolrProvider">
                      <exclude hint="list:AddExcludedField">
                          <__SortOrder>
                              <patch:delete />
                          </__SortOrder>
                      </exclude>
                  </documentOptions>
              </defaultSolrIndexConfiguration>
          </indexConfigurations>
      </contentSearch>
  </sitecore>
</configuration>
C# Code
// ./SearchResultModel.cs
using Sitecore.ContentSearch;

public class SearchResultModel
{
    [IndexField(BuiltinFields.Name)]
    public virtual string ItemName { get; set; }

    // 註意此處需要填 SortOrder 的 Item name, 而不是 Title(通常在 sitecore 里直接看到就是 Title) 或者 Display Name
    // 可通過它的 ID 找出證實一下 {BA3F86A2-4A1C-4D78-B63D-91C2779C1B5E}
    // 或通過路徑:/sitecore/templates/System/Templates/Sections/Appearance/Appearance/__Sortorder
    [IndexField("__Sortorder")]
    public virtual int SortOrder { get; set; }

    [IndexField(BuiltinFields.Language)]
    public virtual string Language { get; set; }

    [IndexField(BuiltinFields.LatestVersion)]
    [ScriptIgnore]
    public virtual bool IsLatestVersion { get; set; }
}

// ----------------------------------------------

// ./Sample.cs
using Sitecore.ContentSearch;
using Sitecore.Globalization;
using Sitecore.ContentSearch.Linq.Utilities;
    
var indexName = "sitecore_web_index";
var language = Sitecore.Globalization.Language.Parse("en");
using (IProviderSearchContext context = ContentSearchManager.GetIndex(indexName))
{
    var predicate = PredicateBuilder.True<SearchResultModel>();
    if (!Sitecore.Context.PageMode.IsNormal)
        predicate = predicate.And(z => z.IsLatestVersion);

    predicate = predicate.And(z => z.Language.Equals(language.Name, StringComparison.OrdinalIgnoreCase));

    var query = context.GetQueryable<SearchResultModel>()
        .Filter(predicate);

    // sitecore 排序的規則為:先按 SortOrder 升序排序,再按 Item name 升序排序
    query = query
        .OrderBy(z => z.SortOrder)
        .ThenBy(z => z.ItemName);

    return query.Select(x => x.Item)?.GetResults().Hits.Select(z => z.Document);
}

*通過使用 IComputedIndexField 介面獲取 SortOrder

此方法與前面不同的地方在於,當欄位值為空時,在 Solr 里仍然可以搜索到此欄位,且值為 100,同時值類型為 int 類型。推薦使用這種方式。

AddSortOrderField_Patch.config
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
  <system.web>
  </system.web>
  <sitecore>
    <contentSearch>
      <indexConfigurations>
        <defaultSolrIndexConfiguration type="Sitecore.ContentSearch.SolrProvider.SolrIndexConfiguration, Sitecore.ContentSearch.SolrProvider">
          <documentOptions>
            <fields hint="raw:AddComputedIndexField">
              <field fieldName="SortOrder" returnType="int">LinkReit.Feature.Content.ChannelCard.ComputedFields.SortOrderField, LinkReit.Feature.Content.ChannelCard</field>
            </fields>
          </documentOptions>
        </defaultSolrIndexConfiguration>
      </indexConfigurations>
    </contentSearch>
  </sitecore>
</configuration>
C# Code
// ./SortOrderField.cs
using Sitecore.Data.Items;
using Sitecore.ContentSearch;
using Sitecore.ContentSearch.ComputedFields;

public class SortOrderField : IComputedIndexField
{
    public object ComputeFieldValue(IIndexable indexable)
    {
        var item = (Item)(indexable as SitecoreIndexableItem);
        if (item == null) return null;
        
        return item.Appearance.Sortorder;
    }

    public string FieldName { get; set; }

    public string ReturnType { get; set; }
}

// ----------------------------------------------

// ./SearchResultModel.cs
using Sitecore.ContentSearch;

public class SearchResultModel
{
    [IndexField(BuiltinFields.Name)]
    public virtual string ItemName { get; set; }

    // 此處 IndexFieldAttribute 構造參數需要填寫的是你配置的 SortOrder 的 fieldName
    [IndexField("SortOrder")]
    public virtual int SortOrder { get; set; }

    [IndexField(BuiltinFields.Language)]
    public virtual string Language { get; set; }

    [IndexField(BuiltinFields.LatestVersion)]
    [ScriptIgnore]
    public virtual bool IsLatestVersion { get; set; }
}

// ----------------------------------------------

// ./Sample.cs
using Sitecore.ContentSearch;
using Sitecore.Globalization;
using Sitecore.ContentSearch.Linq.Utilities;
    
var indexName = "sitecore_web_index";
var language = Sitecore.Globalization.Language.Parse("en");
using (IProviderSearchContext context = ContentSearchManager.GetIndex(indexName))
{
    var predicate = PredicateBuilder.True<SearchResultModel>();
    if (!Sitecore.Context.PageMode.IsNormal)
        predicate = predicate.And(z => z.IsLatestVersion);

    predicate = predicate.And(z => z.Language.Equals(language.Name, StringComparison.OrdinalIgnoreCase));

    var query = context.GetQueryable<SearchResultModel>()
        .Filter(predicate);

    // sitecore 排序的規則為:先按 SortOrder 升序排序,再按 Item name 升序排序
    query = query
        .OrderBy(z => z.SortOrder)
        .ThenBy(z => z.ItemName);

    return query.Select(x => x.Item)?.GetResults().Hits.Select(z => z.Document);
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 問題描述: 利用pyinstaller對python代碼打包後,dist文件夾中會生成一個xxx.exe可執行文件。打包成功,但運行exe時一閃而過(閃退)。捕捉不對到底是打包錯誤呢,還是其他異常?那麼如何解決? PS:以上現象在windows系統中會出現,在Linux和mac系統中不會出現。 解決 ...
  • 將一個正整數n拆分成若幹個正整數的和(至少兩個數,n<=100)。 輸入格式: 一個正整數n 輸出格式: 若幹行,每行一個等式(數與數之間要求非降序排列)。最後一行給出解的總個數 輸入樣例: 在這裡給出一組輸入。例如: 4 輸出樣例: 4=1+1+1+1 4=1+1+2 4=1+3 4=2+2 4 ...
  • 線程理論 線程和進程的區別 進程 進程是操作系統分配資源的最小單位,每個進程都是一個在運行中的程式,在windows中一個運行的xx.exe就是一個進程,他們都擁有自己獨立的一塊記憶體空間,一個進程可以有多個線程 線程 線程是操作系統調度的最小單元,負責當前進程中程式的執行,一個進程可以運行多個線程, ...
  • RabbitMQ的工作模式 一、模式概述 **RabbitMQ提供了6種工作模式:**簡單模式、工作隊列模式、訂閱模式、路由模式、通配符模式、遠程調用模式 其中遠程調用模式(RPC)暫不作介紹。 官網對於模式介紹:https://www.rabbitmq.com/getstarted.html 二、 ...
  • 1 函數 1.1函數的介紹 1.1.1 函數的概述 函數是c語言的功能單位。實現一個功能可以封裝一個函數來實現。 定義函數的時候一切以功能為目的,根據功能去定函數的參數和返回值需要傳哪些數據給函數?(實參)、函數的功能代碼(函數體)如何實現?函數需要返回什麼類型的數據?考慮(傳入參數、函數體、返回值 ...
  • C#參數修飾 ref修飾符: 使用ref修飾符可以使參數成為一個引用類型,從而允許我們在函數中修改該參數的值。如果我們將一個變數傳遞給一個使用ref修飾符的參數,那麼任何對該參數的修改都將影響到原始變數的值。例如: void MyFunction(ref int myParam) { myParam ...
  • 本次使用 SqlConnection 來連接資料庫,使用 DataGridView 來顯示查詢的結果。最終效果如下: 一、連接資料庫 1.獲取連接資料庫所需的字元串,包括伺服器名稱,資料庫名稱,用戶名以及密碼,可在配置文件中配置,或直接在代碼里寫死 在配置文件 App.config 中配置的代碼: ...
  • 前言 ASP.NET Core Web API 介面限流、限制介面併發數量,我也不知道自己寫的有沒有問題,拋磚引玉、歡迎來噴! 需求 寫了一個介面,參數可以傳多個人員,也可以傳單個人員,時間範圍限制最長一個月。簡單來說,當傳單個人員時,介面耗時很短,當傳多個人員時,一般人員會較多,介面耗時較長,一般 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...