[ウォークスルー] カスタム エンタープライズ検索 Web パーツを作成する

Microsoft Office SharePoint Server 2007 でのエンタープライズ検索 を使用すると、検索センター ページおよび Web パーツの外観や機能をブラウザからカスタマイズすることができます。ただし、ブラウザからはできないカスタマイズを行う場合は、クエリ オブジェクト モデルを使用するカスタム Web パーツを作成して検索コンポーネントに対してクエリを実行することができます。

このウォークスルーでは、カスタム検索 Web パーツを作成してサイトに追加します。このウォークスルーで説明する Web パーツには、ごく基本的な検索機能が備えられています。

このウォークスルーでは以下のタスクを処理します。

  • Web パーツのプロジェクトの作成

  • Web パーツのコーディング

  • Web パーツを展開する

前提条件

このウォークスルーを実行するには、以下が必要です。

  • 開発コンピュータにインストールされた Microsoft Visual Studio 2005

  • 開発コンピュータにインストールされた Microsoft Office SharePoint Server 2007

  • 検索センター サイト ページの作成および変更の権限

カスタム検索 Web パーツ プロジェクトを設定する

Web パーツのプロジェクトを作成するには

  1. Visual Studio 2005 の [ファイル] メニューで [新規作成] をポイントし、[プロジェクト] をクリックします。

  2. [プロジェクトの種類] で、[C#] の [Windows] を選択します。

  3. [テンプレート] で、[Web コントロール ライブラリ] を選択します。[名前] フィールドに「[CustomSearchWebPart]」と入力し、[OK] をクリックします。

次に、Web パーツ プロジェクトに必要な参照を追加する必要があります。

注意

Microsoft Office SharePoint Server 2007 に対してサポートされる開発環境構成は、Microsoft Office SharePoint Server 2007 がインストールされているサーバーでのローカルな開発です。

CustomSearchWebPart プロジェクトへの参照を追加するには

  1. [プロジェクト] メニューの [参照の追加] をクリックします。

  2. [.NET] タブで、以下の各参照を選択した後、[OK] をクリックします。

    • System.Data

    • System.XML

    • Microsoft.SharePoint

    • Microsoft.Office.Server

    • Microsoft.Office.Server.Search

Web パーツのコードを追加する前に、既定のクラス ファイルを新しいクラス ファイルに置き換えます。

Web パーツのクラス ファイルを作成するには

  1. [ソリューション エクスプローラ] で、WebCustomControl1.cs を右クリックして [削除] をクリックし、そのプロジェクトで作成された既定のクラスを削除します。

  2. [プロジェクト] メニューの [新しいアイテムの追加] をクリックします。

  3. [新しいアイテムの追加] ダイアログ ボックスで、[Web カスタム コントロール] をクリックし、「[clsSearchQuery.cs]」と入力して [追加] をクリックします。

カスタム検索 Web パーツ コードを記述する

新しいクラス ファイルに含まれる既定のコードを変更することができます。

clsSearchQuery の既定のコードを変更するには

  1. 以下の名前空間ディレクティブを、clsSearchQuery.cs のコードの上部付近に追加します。

    using System.Drawing;
    using System.Data;
    using System.Xml;
    using System.Xml.Serialization;
    using Microsoft.SharePoint.WebPartPages;
    using Microsoft.Office.Server;
    using Microsoft.Office.Server.Search.Query;
    
  2. 以下のコード行で、WebControl を WebPart に置き換えます。

    public class clsSearchQuery : WebControl
    
  3. 以下のコード行を、clsSearchQuery のクラス宣言の上に追加します。

    [XmlRoot(Namespace = "CustomSearchWebPart")]
    

これで、検索コンポーネントをクエリするコードを記述し、Web パーツのコンテンツをレンダリングすることができます。

Web パーツの子コントロールを追加してレンダリングするには

  1. 以下のコードをクラス宣言の下に追加します。

            Button cmdSearch;
            TextBox txtQueryText;
            Label lblQueryResult;
            DataGrid grdResults;
    
  2. 以下のコードを使用して、CreateChildControls メソッドを上書きします。

    protected override void CreateChildControls()
            {
                Controls.Clear();
                txtQueryText = new TextBox();
                this.Controls.Add(txtQueryText);
                cmdSearch = new Button();
                cmdSearch.Text = "Start Search";
                cmdSearch.Click += new EventHandler(cmdSearch_Click);
                this.Controls.Add(cmdSearch);
                lblQueryResult = new Label();
                this.Controls.Add(lblQueryResult);
            }
    
  3. 以下のコードを使用して、cmdSearch の click イベントを追加します。

            void cmdSearch_Click(object sender, EventArgs e)
            {
                if (txtQueryText.Text != string.Empty)
                {
                  keywordQueryExecute(txtQueryText.Text);
                }
                else
                {
                  lblQueryResult.Text = "You must enter a search word.";
                }
              }
    

これで、クエリ オブジェクト モデルにアクセスするコードを追加することができます。このコード サンプルは Microsoft.Office.Server.Search.Query.KeywordQuery クラスを使用し、[Microsoft.Office.Server.ServerContext] オブジェクトをパラメータ値に渡して検索クエリを実行します。検索クエリは簡単なキーワード クエリで、Author プロパティが検索用語と一致する結果を検索します。

キーワード クエリを実行するには

  1. 以下のコードを clsSearchQuery クラスに追加します。

    private void keywordQueryExecute(string strQueryText)
            {
                KeywordQuery kRequest = new KeywordQuery(ServerContext.Current);
                string strQuery = "author:" + strQueryText;
                kRequest.QueryText = strQuery;
                //to return relevant results
                kRequest.ResultTypes |= ResultType.RelevantResults;
                ResultTableCollection resultTbls = kRequest.Execute();
                if ((int)ResultType.RelevantResults != 0)
                {
                    ResultTable tblResult = resultTbls [ResultType.RelevantResults];
                    if (tblResult.TotalRows == 0)
                    {
                      lblQueryResult.Text = "No Search Results Returned.";
                    }
                    else
                    {
                        ReadResultTable(tblResult);
                    }
    
                }
    }
    
  2. 検索結果データを読み取るために、keywordQueryExecute メソッドは ReadResultTable メソッドを呼び出します。 以下のコードを ReadResultTable に追加します。

    void ReadResultTable(ResultTable rt)
            {
                DataTable relResultsTbl = new DataTable();
                relResultsTbl.TableName = "Relevant Results";
                DataSet ds = new DataSet("resultsset");
                ds.Tables.Add(relResultsTbl);
                ds.Load(rt,LoadOption.OverwriteChanges,relResultsTbl);
                fillResultsGrid(ds);
            }
    
  3. ReadResultTable メソッドは、fillResultsGrid メソッドを呼び出して、検索結果 DataSet を grdResults DataGrid にバインドします。コードを fillResultsGrid に追加します。

    private void fillResultsGrid(DataSet grdDs)
            {
    //Instantiate the DataGrid, and set the DataSource
                grdResults = new DataGrid();
                grdResults.DataSource = grdDs;
    //Set the display properties for the DataGrid.
                grdResults.GridLines = GridLines.None;
                grdResults.CellPadding = 4;
                grdResults.Width = Unit.Percentage(100);
                grdResults.ItemStyle.ForeColor = Color.Black;
                grdResults.ItemStyle.BackColor = Color.AliceBlue;
                grdResults.ItemStyle.Font.Size = FontUnit.Smaller;
                grdResults.ItemStyle.Font.Name = "Tahoma";
                grdResults.HeaderStyle.BackColor = Color.Navy;
                grdResults.HeaderStyle.ForeColor = Color.White;
                grdResults.HeaderStyle.Font.Bold = true;
                grdResults.HeaderStyle.Font.Name = "Tahoma";
                grdResults.HeaderStyle.Font.Size = FontUnit.Medium;
    
    /*Turn off AutoGenerate for the columns, so that the DataGrid
    doesn't automatically bind to all of the columns
    in the search results set.
    Then create and configure only the columns you want to
    include in the DataGrid.
    */
                grdResults.AutoGenerateColumns = false;
                HyperLinkColumn colTitle = new HyperLinkColumn();
                colTitle.DataTextField = "Title";
                colTitle.HeaderText = "Title";
                colTitle.DataNavigateUrlField = "Path";
                grdResults.Columns.Add(colTitle);
                BoundColumn colAuthor = new BoundColumn();
                colAuthor.DataField = "Author";
                colAuthor.HeaderText = "Author";
                grdResults.Columns.Add(colAuthor);
    //Bind the data to the DataGrid
                grdResults.DataBind();
    //Add the DataGrid to the controls
                Controls.Add(grdResults);
            }
    

カスタム検索 Web パーツを展開する

このサンプルから作成するカスタム検索 Web パーツには厳密な名前が付けられていないため、グローバル アセンブリ キャッシュに展開することはできません。サイトの _app_bin ディレクトリに展開する必要があります。

カスタム検索 Web パーツをサイトに展開するには

  1. CustomSearchWebPart.dll をサイトの _bin ディレクトリにコピーします。パスは以下のようになります。

    \Inetpub\wwwroot\wss\VirtualDirectories\Site\_app_bin
    

    注意

    サイトのアプリケーション パスが不明な場合は、インターネット サービス マネージャで確認することができます。

  2. インターネット サービス マネージャ コンソールを開いて [Web サイト] ノードを展開し、サイトのアプリケーションを右クリックしてから [プロパティ] をクリックします。

  3. [ホーム ディレクトリ] タブをクリックします。

    [ローカル パス] フィールドには、アプリケーションへのパスが含まれています。

カスタム検索 Web パーツを SafeControl として登録するには

  1. カスタム検索 Web パーツを追加するサイトの web.config ファイルを開きます。このファイルはサイトのルート フォルダにあります。

  2. 以下の <SafeControl/> タグを、web.config の <SafeControls> </SafeControls> セクションに追加します。

    <SafeControl Assembly="CustomSearchWebPart, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" Namespace="CustomSearchWebPart" TypeName="*" Safe="True" />
    
  3. 変更を保存し、web.config ファイルを閉じます。

カスタム検索 Web パーツ定義ファイルを作成するには

  1. メモ帳などのテキスト エディタで新しいファイルを開き、ファイルに以下の XML コードを追加します。

    <?xml version="1.0"?>
    <WebPart xmlns="https://schemas.microsoft.com/WebPart/v2">
       <Assembly>CustomSearchWebPart, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=null</Assembly>
       <TypeName>CustomSearchWebPart.clsSearchQuery</TypeName>
       <Title>Custom Search Web Part</Title>
    </WebPart>
    
  2. ファイルに CustomSearchWebPart.dwp と名前を付けて保存します。

    注意

    Office SharePoint Server 2007 サーバーを使用していない場合、この手順を完了するには、ファイルを Office SharePoint Server 2007 サーバーにコピーする必要があります。

カスタム検索 Web パーツを SafeControl として登録するには

  1. カスタム検索 Web パーツを追加するサイトの web.config を開きます。

  2. 以下の <SafeControl/> タグを web.config の <SafeControls> セクションに追加します。

    <SafeControl Assembly="CustomSearchWebPart, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" Namespace="CustomSearchWebPart" TypeName="*" Safe="True" />
    

カスタム検索 Web パーツをサイトに展開するには

  • CustomSearchWebPart.dll をサイトの _bin ディレクトリにコピーします。パスは以下のようになります。

    \Inetpub\wwwroot\wss\VirtualDirectories\Site
    

Next Steps

clsSearchQuery クラスのサンプルの完全なコードは 「サンプル : カスタムのエンタープライズ検索 Web パーツ コード」にあります。

Web パーツを展開したら、そのテストを行うことができます。

カスタム検索 Web パーツをテストするには

  1. ブラウザで検索センターサイトを開き、[サイトの操作] メニューの [ページの作成] をクリックします。

  2. [URL 名] フィールドに「[customsearchwebparttest]」と入力します。

  3. [タイトル] フィールドに「[カスタム検索 Web パーツ用テスト ページ]」と入力します。

  4. [ページ レイアウト] リストで [ (Welcome Page) Search Page] を選択します。

  5. ページを作成するには、[作成] をクリックします。

  6. ブラウザで開いた customsearchwebparttest.aspx ページで、[最上部領域] にある [Web パーツの追加] リンクをクリックします。

  7. [Web パーツの追加] ダイアログ ボックスで、[Web パーツ ギャラリーとオプションの詳細設定] リンクをクリックします。

  8. [参照] リンクをクリックしてから [インポート] をクリックします。

  9. [参照] をクリックして、CustomSearchWebPart.dwp を保存した場所に移動してこれを選択し、[開く] をクリックします。

    ダイアログ ボックスにカスタム検索 Web パーツが表示されます。これをページにドラッグして使用できます。

See Also

タスク

[ウォークスルー] AdventureWorks ビジネス データ アプリケーション サンプル用の ASP.NET Web パーツを作成する

参照

エンタープライズ検索のキーワード構文の参照

Microsoft.Office.Server.Search.Query.KeywordQuery

概念

エンタープライズ検索カスタム Web パーツの基礎知識

エンタープライズ検索のクエリ オブジェクト モデルの概要