検索結果に基づいてアイテムのURLを取得する

Version:
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

検索結果を使用して、アイテムのURLを生成できます。これにより、データベース呼び出しが削減され、サイト訪問者を関連するコンテンツに誘導するリンクを使用して各検索結果をレンダリングできます。このトピックでは、アイテムのURLを取得する3つの異なる方法を示します。

UrlLink計算インデックス フィールドを有効にする

計算されたインデックス フィールドからアイテムのURLを取得するには:

  1. UrlLink計算インデックス フィールドを有効にし、それをurllinkインデックス フィールドに格納するには、構成パッチ ファイルを作成し、App_Config\Includeフォルダーにパッチを適用します。

    <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/" xmlns:role="http://www.sitecore.net/xmlconfig/role/ 
    xmlns:search="http://www.sitecore.net/xmlconfig/search/">
      <sitecore role:require="Standalone or ContentManagement or ContentDelivery or XMCloud" search:require="solr">
        <contentSearch>
          <indexConfigurations>
            <defaultSolrIndexConfiguration>
              <documentOptions>
                <fields hint="raw:AddComputedIndexField">
                  <field fieldName="urllink" returnType="string" type=" Sitecore.ContentSearch.ComputedFields.UrlLink,Sitecore.ContentSearch" />
                </fields>
              </documentOptions>
            </defaultSolrIndexConfiguration>
          </indexConfigurations>
        </contentSearch>
      </sitecore>
    </configuration>

    インデックスを再構築すると、インデックス付きドキュメントには、このアイテムへのリンクを格納する追加のurllink_sフィールドがあります。

  2. 検索結果のURLにアクセスするには、プロパティにIndexField("urllink") 属性がある場合、またはプロパティの名前がフィールド値の名前 (つまりUrlLink) と一致する場合に限り、カスタムSearchResultItemクラスを使用してURLにアクセスします。

    public
    class CustomSearchResultItem
        {
            
     
            [IndexField("urllink")]
            public virtual string Url
            {
                get;
                set;
            }
        }
  3. インデックス付き値にアクセスするには、CustomSearchResultItemクラスのUrlプロパティを使用します。

       IQueryable<CustomSearchResultItem> query = 
    context.GetQueryable<CustomSearchResultItem>().Where(<conditions>);
       var result = query.ToList();
       var -urlLink = result.First().Url;
    メモ

    また、Sitecore.ContentSearch.SearchTypes.SearchResultItemUrlプロパティを通じてこのフィールドを使用して、インデックス付き値にアクセスすることもできます。

カスタム計算インデックス フィールドを実装する

リンクの生成方法をより詳細に制御する必要がある場合は、カスタム計算インデックスフィールド を作成できます。これを行うには、次の手順を実行します。

  1. CustomUrlLinkなどのカスタムクラスを作成し、インデックス設定に登録します。

    namespace <YOUR_NAMESPACE>.ComputedFields
    {
        public class CustomUrlLink: AbstractComputedIndexField
        {
              private readonly BaseLinkManager _linkManager;
    
                 ...
     
              public override object ComputeFieldValue(IIndexable indexable)
              {
                  Item item = indexable as SitecoreIndexableItem;
     
                  if (item == null)
                  {
                      return null;
                  }
    
                  var urlOptions = _linkManager.GetDefaultUrlBuilderOptions();
                  // Populate parameters of 'urlOptions'
     
                  return _linkManager.GetItemUrl(item, urlOptions);
              }
        }
    }
    <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"
    xmlns:role="http://www.sitecore.net/xmlconfig/role/" xmlns:search="http://www.sitecore.net/xmlconfig/search/">
      <sitecore role:require="Standalone or ContentManagement or ContentDelivery or XMCloud" search:require="solr">
        <contentSearch>
          <indexConfigurations>
            <defaultSolrIndexConfiguration>
              <documentOptions>
                <fields hint="raw:AddComputedIndexField">
                  <field fieldName="customurllink" returnType="string" type="<YOUR_NAMESPACE>.ComputedFields.CustomUrlLink,<YOUR_NAMESPACE>"/>
                </fields>
              </documentOptions>
            </defaultSolrIndexConfiguration>
          </indexConfigurations>
        </contentSearch>
      </sitecore>
    </configuration>

    インデックスを再構築すると、インデックス付きドキュメントには、このアイテムへのリンクを格納する追加のcustomurllink_sフィールドが追加されます。

  2. IndexField("customurllink") 属性を持つプロパティ、またはフィールド値の名前と一致する名前 (CustomUrlLink) を持つCustomSearchResultItemクラスを作成して、アイテムのURLにアクセスします。

        public class CustomSearchResultItem
        {
            
    
            [IndexField("customurllink")]
            public virtual string Url
            {
                get;
                set;
            }
        }
  3. これで、CustomSearchResultItemクラスのUrlプロパティを使用して、インデックス付き値にアクセスできるようになりました。

       IQueryable<CustomSearchResultItem> query = context.GetQueryable<CustomSearchResultItem>().Where(<conditions>);
       var result = query.ToList();
       var customUrlLink = result.First().Url;

実際のアイテムに基づいてアイテムのURLを作成する

検索結果でアイテムを取得した場合は、Sitecore.Links.LinkManager.GetItemUrlを使用してアイテムのURLを取得できます。

URLを作成する前にアイテムを取得するには:

  • アイテムを取得するには、元のGetItemSearchResultItem方法を使用します。

または、設定をオーバーライドしたり、SearchResultItemクラスに何かを追加したりする場合は、次のように、これらの要件を満たすカスタムSearchResultItemクラスを作成できます。

    public class CustomSearchResultItem
    {
        

        [XmlIgnore]
        [IndexField(BuiltinFields.UniqueId)]
        [DataMember]
        [TypeConverter(typeof(IndexFieldItemUriValueConverter))]
        public virtual ItemUri Uri { get; set; }

        public virtual Item GetItem()
        { 
            if (this.Uri == null)
            {
                return null;
            }

            return Factory.GetDatabase(this.Uri.DatabaseName).GetItem(this.Uri.ItemID, this.Uri.Language, this.Uri.Version);
        }
    }

次に、CustomSearchResultItemクラスのGetItemメソッドを使用してアイテムを取得します。

       IQueryable<CustomSearchResultItem> query = context.GetQueryable<CustomSearchResultItem>().Where(<conditions>);
       var actualItem = query.ToList().First().GetItem();

       BaseLinkManager linkManager = ...
       var options = linkManager.GetDefaultUrlBuilderOptions();
       // Populate parameters of 'options'

       var url = linkManager.GetItemUrl(actualItem, options);
この記事を改善するための提案がある場合は、 お知らせください!