訪問者はあなたのコンテンツを探しています。彼らが探しているものを正確に見つけるのをどのように助けることができますか?
1つの答えは、検索を追加することです。より一般的なものの1つであるAzureCognitiveSearchを統合する方法を見てみましょう。この記事では、インデックスの作成、更新、クエリの基本について説明します。インデックスには、DancingGoatサンプルプロジェクトの記事が含まれます。
Azure CognitiveSearch入門
開始するには、最初に使用するAzure CognitiveSearchサービスをプロビジョニングする必要があります。これは、 Azureポータルで実行できます。 Microsoftには、無料で開始するために使用できる無料の階層があります。サービスをプロビジョニングした後、サービス名と管理APIキーをメモする必要があります。以下のスクリーンショットは、Azureポータルの管理キーの場所を示しています。
初期インデックスの作成
プロジェクトのスピンアップ
始める前に、 完全なソースはGitHubで入手できます。それをダウンロードして、フォローするか、プロジェクトを新しく作成することができます。
この簡単なデモを作成するには、新しいASP.NET CoreWebアプリケーションを作成することから始めます。このチュートリアルのコードサンプルは、名前に「Kontent-Azure-Search-Demo」を使用することを前提としています。以下に示すように、「Webアプリケーション(Model-View-Controller)」テンプレートを選択します。
次に、いくつかの設定値を追加する必要があります。 appsettings.json
追加できます。一部の値は機密性が高いため、代わりに「ユーザーシークレット」の使用を検討することをお勧めします。
いずれの場合も、これらのJSONファイルのいずれかにいくつかのキーと値のペアを追加する必要があります。値に基づいて更新する必要があります。 SearchServiceName
は、Azure Cognitive SearchServiceの名前です。 SearchServiceAdminApiKey
は、前述の管理者キーです。 SearchServiceIndexName
は、インデックスに使用する名前です。他の2つはKenticoKontent用です。 KenticoProjectID
は、検索しているプロジェクトのプロジェクトIDです。将来作成するコードは、DancingGoatサンプルプロジェクトを想定しています。 KontentWebhookSecret
は、後で使用するものです。今のところ、これは空白にするか、ダミー値のままにしておくことができます。
次に、NuGetパッケージをいくつか追加する必要があります。 Kentico.Kontent.DeliveryパッケージとMicrosoft.Azure.Searchパッケージの両方を見つけて追加します。これらにより、KontentSDKとAzureCognitive SearchSDKがプロジェクトに追加されます。
モデルの追加
Key
は、Azure検索が各インデックス付きアイテムを識別するために使用するプロパティを識別します。これは、 System.ComponentModel.DataAnnotations
名前空間にあります。
IsSearchable
は、ユーザーが検索できるようにするデータがプロパティに含まれているかどうかを示します。これは、 Microsoft.Azure.Search
名前空間にあります。
IsRetrievable
は、特定のプロパティが検索結果で返されるかどうかを示します。これは、Microsoft.Azure.Search名前空間にあります。これはデフォルトでtrueに設定されているため、検索結果(記事の本文など)でプロパティを返したくない場合にのみ追加する必要があります。
Analyzer(AnalyzerName.AsString.EnMicrosoft)
は、使用するアナライザーをAzureに指示します。これは、Microsoft.Azure.Search.Models名前空間にあります。 EnMicrosoft
アナライザーは、デフォルトのアナライザーよりも英語の単語をよく理解します。その結果、より良い検索結果を提供できます。
デモでは、「Models」フォルダー内のArticle.cs
ファイルに次のコードを追加できます。
ロジックの構築
次に、主要な操作を処理するためのヘルパーをいくつか作成しましょう。 Kontentから記事を取り出し、Azureで検索インデックスを管理し、検索を実行する必要があります。
Kontentヘルパー
まず、プロジェクトルートに「Helpers」フォルダを作成しましょう。 KontentHelper.cs
という新しいクラスファイルを作成します。このヘルパークラスには、Kontentから記事を取得するために必要なメソッドがあります。この新しいファイルに、以下を追加します。
コンストラクターはアプリケーション構成を受け入れ、それを使用して配信クライアントを作成します。メソッドは、この配信クライアントを使用してKontentから記事を取得します。
GetArticleByUrlPattern
メソッドは、渡されたURLパターンに一致する最初の記事を取得します。詳細ページです。
GetArticlesForSearch
メソッドは、配信APIからすべての記事を取得します。そのオーバーロードは、提供されたIDと一致するIDを持つすべての記事を取得します。どちらの場合も、取得した結果を記事クラスに変換します。
GetArticle
メソッドは、記事のコンテンツアイテムを記事クラスにマップします。 GetArticlesForSearch
メソッドとそのオーバーロードによって使用されるプライベートメソッドです。
検索ヘルパー
次に、「Helpers」フォルダにSearchHelper.cs
という新しいクラスファイルを作成します。このヘルパークラスには、Azureで検索インデックスを管理し、クエリを実行するために必要なメソッドが含まれます。この新しいファイルに、以下を追加します。
コンストラクターは、いくつかの再利用可能なリソースを準備します。インデックス名を保存し、検索サービスクライアントを作成し、検索インデックスクライアントのコピーを保存します。
AddToIndex
メソッドは、AzureSearchインデックスへの記事の追加を処理します。ドキュメントを取得し、それらのアップロードアクションのバッチを作成し、それをAzureに送信して処理します。 Article
クラスのような装飾されたドキュメントクラスが必要です。
CreateIndex
メソッドは、渡されたクラスに基づいてインデックス定義を作成します。 Article
クラスのような装飾されたクラスを期待しています。次に、Azureでインデックスを作成します。
DeleteIndexIfExists
メソッドは、構成されたインデックスがAzureに既に存在するかどうかを判断します。存在する場合は削除します。それ以外の場合は、何もしません。
QueryIndex
メソッドは、検索テキストを想定しています。このテキストをAzureに渡して、検索を実行し、結果を返します。結果からドキュメントのリストのみを返します。
RemoveFromIndex
メソッドは、Azureインデックスからのドキュメントの削除を処理します。ドキュメントを取得し、それらの削除アクションのバッチを作成して、処理のためにAzureに送信します。ドキュメントは、機能するドキュメントキーとして機能するプロパティを提供するだけで済みます。 Article
クラスのような装飾されたドキュメントクラスが必要です。
プライベートCreateSearchServiceClient
メソッドはコンストラクター用です。 Azure CognitiveSearchの検索サービスクライアントの作成を処理します。構成された検索サービス名と管理APIキーを読み取ります。次に、AzureのSDKを使用して検索サービスクライアントを作成します。
基本的なUIの作成
検索コントローラーとビュー
次に、検索操作を管理するコントローラーを追加する必要があります。 SearchControllerという名前の新しい空のMVCコントローラーを追加することから始めます。次に、以下を追加します。
コンストラクターは、依存性注入を使用して構成値を公開します。 SearchHelper
クラスのインスタンスを初期化して、コントローラーアクションで使用できるようにします。
最初のアクションであるCreate
は、使用しているインデックスを作成(または再作成)することです。呼び出されると、これはSearchHelperクラスのdeleteおよびcreate検索インデックスメソッドを呼び出します。これにより、インデックスが完全にクリーンな状態で開始されていることが確認されます。また、ページを更新できるようViewData
簡単なステータスメッセージを書き込みます。最後に、コードがすべての検索アクションに対して単一のビューを共有するため、インデックスビューを返します。
2番目のメソッドIndex
は、検索コントローラーの基本的なインデックスビューを返します。
最後のメソッドであるInitialize
、Kontentからすべての記事を取得し、それらをインデックスに追加します。その主な目的は、初期データをインデックスにロードすることです。
次に、コントローラーのビューを作成しましょう。 「検索」という名前の新しいフォルダーを「ビュー」フォルダーに作成し、そこに次のようIndex.cshtml
これにより、作成アクションと初期化アクションのボタンとシンプルな検索ボックスを備えたシンプルなページが表示されます。結果ページとしても機能します。返された結果には、タイトル、リンクされた記事の詳細ページ、および概要が表示されます。コントローラとビューをまだ追加していないため、詳細リンクはまだ機能しません。今それをしましょう。
記事の管理者と表示
リンク先の結果ビューを提供するために、記事の最低限の詳細ビューを追加しましょう。 「Controllers」フォルダーに戻り、新しい空のMVCコントローラーを追加します。この1つのArticle
名前を付け、次を追加します。
コンストラクターは構成を受け入れ、初期化されたKontentヘルパーを保存します。
Detail
メソッドは、渡されたURLパターンを取得し、そのコンテンツアイテムを取得して、ビューに渡します。このビューを作成しましょう。
「Views」フォルダに「Article」という新しいフォルダを作成します。以下を使用して、そこにDetail.cshtml
ファイルを追加します。
これにより、渡されたコンテンツアイテムが取得され、ティーザー画像(存在する場合)、タイトル、および本文のコピーが表示されます。これは簡単な例にすぎないため、あまり処理しません。たとえば、リッチテキストフィールド内のアイテムリンク、コンポーネント、またはアイテムは解決されません。
試してみる
それはたくさんのコードでしたが、今では試してみるのに必要なものがすべて揃っています。 F5
か、プロジェクトのデバッグを開始して、ブラウザーでプロジェクトを起動できます。ウェルカムページが読み込まれたら、 /search
を追加して、作成した検索ページにアクセスします。次のようになります。
最初に行う必要があるのは、「インデックスの作成」ボタンをクリックしてインデックスを作成することです。ページがリロードされ、「インデックスが削除/作成されました」と表示されます。メッセージ。次に、「インデックスの初期化」ボタンをクリックして、インデックスをロードします。ダンシングゴートからインデックスに記事をロードした後、ページがリロードされます。リロード後、「インデックスが初期化されました」と表示されます。メッセージ。最後に、実際の検索を試す準備ができました。 「コーヒー」を検索すると、次のようなものが表示されます。
結果の1つをクリックすると、次のような詳細ページが表示されます。
インデックスを最新の状態に保つ
すばらしいので、機能します。どのように更新しておくのですか? Kontentを使用すると、Kontentプロジェクトの特定のイベントに反応するようにWebhookを構成できます。
ローカルコードのパブリックURLを取得する
まず、ローカルマシンでKontentからWebhookを受信するように設定しましょう。これをまだ処理する方法がない場合は、簡単で無料のオプションとしてngrokを使用する方法について説明します。開始するには、指示に従ってください。起動する準備ができたら、以下のコマンドを実行して、ローカル開発サーバーをポイントします。プロジェクトが実行されている場所にlocalhost:44345を更新する必要があります。
そのコマンドを実行すると、次のようなメッセージが表示されます。
Kontent Webhookのターゲットとして、リストの最後にあるURLの1つを使用することをお勧めします。上のスクリーンショットでは、「https://a241e689.ngrok.io」を使用します。
KenticoKontentでのWebhookの構成
次に、KontentでWebhookを構成しましょう。 「設定」に移動し、「Webhook」を選択します。 「CreateNewWebhook」ボタンをクリックして、Webhook名を入力します。次に、エンドポイントへのパブリックURLを入力し、その末尾に「/ webhook」を追加してください。 「公開」および「非公開」配信APIトリガーを必ず有効にしてください。また、残りのトリガーをクリアします。次のようになります。
コードでのWebhookのサポート
アプリケーションの設定
まず、appsettings.json(またはユーザーsecrets.json
)にappsettings.json
する必要があります。上記のWebhook設定画面からシークレットをコピーします。 KontentWebhookSecret
設定値に貼り付けます。
モデルとWebhookヘルパー
KontentWebhookModels.cs
という新しいファイルを追加します。その中に、以下を追加します。
これは、KontentがWebhookで送信するJSONに一致するモデルのコレクションです。
KontentWebhookHelper.cs
という名前の「Helpers」フォルダーに新しいヘルパークラスを追加しましょう。これには次のものが含まれます。
コンストラクターはアプリケーション設定を受け入れ、Webhookシークレットを保存します。
ValidateAndProcessWebhook
メソッドは、x-kc-signatureヘッダーと完全なWebhook本体を受け取ります。リクエストがKontentからのものであることを検証します。次に、検索インデックスに対して実行可能な何かがあることを確認します。いくつかのことをチェックして、実行可能なものがあるかどうかを判断します。まず、コンテンツアイテムのバリアントに対してWebhookが起動したことを確認します。次に、操作が公開イベントまたは非公開イベントのいずれかであったことを確認します。最終チェックでは、イベントのアイテムのいずれかがen-US言語の記事であるかどうかを判断します。これらのチェックのいずれかが失敗した場合、メソッドはエラーメッセージとともに誤った検証結果を返します。チェックに合格すると、真の検証結果がWebhookに含まれる記事を返します。
GenerateHash
メソッドは、ドキュメントに記載されているハッシュアルゴリズムを実装します。
検索コントローラーの更新
検索コントローラーに切り替えて、Kontentに追加した「/ webhook」URLに応答するアクションを追加する必要があります。
KontentWebhookHelperの新しいプライベートフィールドを追加しました。コンストラクターが初期化します。また、新しいコントローラーアクションを追加しました。
新しいProcessWebhook
アクションは、「/ webhook」URLへのHTTP投稿に応答します。署名の検証に未加工の本体を使用する必要があるため、本体を手動で解析します。
Webhookの本体と署名をValidateAndProcessWebhook
メソッドに渡します。結果が有効でない場合は、メソッドから渡されたエラーメッセージを返します。有効な場合は、「公開」操作か「非公開」操作かに基づいてアイテムを更新または削除します。
公開操作の場合は、 GetArticlesForSearch
ヘルパーのGetArticlesForSearchメソッドを呼び出します。 Webhookから記事のIDを渡して、新しいデータを取得します。アイテムデータを取得すると、検索ヘルパーのAddToIndex
メソッドを呼び出してインデックスを更新します。
非公開操作の場合、 Article
クラスのIEnumerableを作成します。 Webhookで送信された記事のIDのみを使用してこのリストを作成します。最後に、検索ヘルパーのAddToIndex
メソッドを呼び出して、インデックスを更新します。
Kontent Webhookに応答し、インデックスを最新の状態に保つために必要なのはこれだけです。
ソースコードと次のステップ
このデモでは、すべての基本を見てきました。 Kontentのコンテンツを使用して、Azure検索インデックスを初期化、検索、および更新しました。上記のすべてを1つのパッケージで確認したい場合は、ソースをGitHubで入手できます。
これは、Azure検索の包括的な実装とはほど遠いものです。ファセットや並べ替えなど、ここでは触れていない機能がたくさんあります。また、1つの言語で1つのコンテンツタイプのみを取り上げました。もう少し探しているのであれば、これらのいずれかを実装することは、次の素晴らしいステップになります。