私はSDLTridion2011(GA)のカスタム検索インデックスハンドラーで遊んでいました。Arjenから提供された非常に役立つ情報を使用して、何かが機能するようになりましたが、自分の実行が最良のオプションであるかどうかはわかりません。
要件は、URL(www.example.com/news/index.htmlなど)でCMSのページを検索できるようにすることです。これを行うために、ISearchIndexingHandler
インターフェイス(以下のコード)を使用してクラスを作成しました。アイテムのContentTextフィールドのURLにインデックスを付けていますが、これに通常はページの他の何かが含まれるかどうかはわかりません(ページにはメタデータしかないので、これで問題ありません)。カスタムフィールドに対してこれを使用する利点は、<url> IN <fieldname>などを使用せずに、検索ボックスにURLを入力するだけで済むことです。
だから私の質問は、ページにContentTextを使用しない理由はありますか?カスタムフィールドを使用することに利点はありますか?また、BluePrintingの処理方法(親のパブリケーションでページを作成する場合は、ローカルのURLも子のパブリケーションでインデックス付けする必要があります)、および構造グループのパスが変更された場合について、優れたアイデアを持っている人にはボーナスマークが付けられます。 (インデックスハンドラー内から、どういうわけか子ページアイテムの再インデックスをトリガーできると思います)。
コード:
using System;
using Tridion.ContentManager.Search;
using Tridion.ContentManager.Search.Indexing.Handling;
using Tridion.ContentManager.Search.Indexing.Service;
using Tridion.ContentManager.Search.Indexing;
using Tridion.ContentManager.Search.Fields;
namespace ExampleSearchIndexHandler
{
public class PageUrlHandler : ISearchIndexingHandler
{
public void Configure(SearchIndexingHandlerSettings settings)
{
}
public void ExtractIndexFields(IdentifiableObjectData subjectData, Item item, CoreServiceProxy serviceProxy)
{
PageData data = subjectData as PageData;
if (data != null)
{
PublishLocationInfo info = data.LocationInfo as PublishLocationInfo;
string url = GetUrlPrefix(data) + info.PublishLocationUrl;
item.ContentText = url;
}
}
private string GetUrlPrefix(PageData page)
{
//hardcoded for now, but will be read from publication metadata
return "www.example.com";
}
}
}