---
title: "検索結果に基づいてアイテムのURLを取得してください"
slug: "get-an-item-url-based-on-a-search-result"
abstract: "検索結果を使ってアイテムURLを作成しましょう。"
---
# 検索結果に基づいてアイテムのURLを取得してください

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

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

検索結果でアイテムを取得した場合、Sitecore.Links.LinkManager.GetItemUrlを使ってアイテムURLを取得することができます。

URLを構築する前にアイテムを取得するには:

-   元の GetItem 方法を使って SearchResultItem を入手してください。

あるいは、設定を上書きしたり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);

## 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 SitecoreAI" 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>
    
    > !注siteName属性を使って、他の方法で解決できない場合に使うフォールバックサイトを指定することができます。 siteNameを指定することは単一サイトの解法でのみ機能し、複数サイトの解法では使えません。
    
    インデックスを再構築した後、インデックスされた文書にはこの項目へのリンクを格納する追加のurllink\_sフィールドが設けられます。
    
2.  検索結果のURLにアクセスするには、プロパティにIndexField("urllink")属性があるか、プロパティ名がフィールド値名と一致している場合、またはカスタムSearchResultItemクラスを使ってURLにアクセスしてください。すなわちUrlLink。
    
    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.SearchResultItemのUrlプロパティを通じてインデックス値にアクセスすることもできます。
    

## カスタム計算インデックスフィールドを実装してください

リンクの生成方法をより細かくコントロールしたい場合は、[カスタムで計算されたインデックスフィールド](https://doc.sitecore.com/xp/ja/developers/101/platform-administration-and-architecture/create-a-computed-index-field.html "Create a computed index field")を作成できます。

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

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 SitecoreAI" 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")属性を持つプロパティ、またはフィールド値の名前に合致する名前を持つCustomSearchResultItemクラスを作成し、アイテムURLにアクセスするためにCustomUrlLinkします。
    
    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;