sitecore
サーチ
サーチ…
備考
Sitecore検索はLuceneの上に構築され、サイトの検索機能を非常に高速に作成できます。中央データベース(SitecoreのSQL DBなど)に対して照会するのではなく、Webサーバーの物理ファイルシステムに格納されているLuceneインデックスファイルを照会します。 Sitecoreは、Lucene.NET APIに抽象レイヤーを提供します.LINQプロバイダーは、Luceneクエリーを.NET開発者にとってシンプルで使い慣れたプロセスで記述することができます。 Sitecoreには標準のインデックスがいくつか用意されており、独自のインデックスを拡張または定義することができます。 SOLRを使用することもできます。 Luceneの上に構築された集中型でスケーラブルなプラットフォームです。
構成
Sitecoreには標準の索引が事前に設定されています。この索引を拡張するか、独自の索引を定義することができます。事前設定されたsitecore_master_index
とsitecore_web_index
は、サイトの検索に最も関心があります。これらは、マスターデータベースとウェブデータベースのツリー内のすべてのSitecore項目の事前定義済みのインデックスであり、すべてのテンプレートに共通するSitecore項目の標準フィールドをすべて格納するように設定されています。
次の場所で標準Webインデックスのこの設定を見ることができます。 <Your Site>\App_Config\Include\Sitecore.ContentSearch.Lucene.Index.Web.config
索引の構成の重要な主な領域は次のとおりです。
- フィールドの設定 - どのフィールドをインデックスに保存し、どのようにフィールドを保存するか。
- 戦略 - インデックスをいつ、どのように更新すべきか。
- クローラ - インデックスがSitecoreのデータを取得できる場所
フィールドの設定
sitecore_web_index
設定を見ると、 <configuration ref="contentSearch/indexConfigurations/defaultLuceneIndexConfiguration" />
参照を見ることができます。これは、 <Your Site>\App_Config\Include\Sitecore.ContentSearch.Lucene.DefaultIndexConfiguration.config
にある共有インデックス構成ファイルを参照します。ここでは、標準設定に含まれているすべてのフィールドを見ることができます。
基本的には、フィールドを定義するには2つの方法があります.1つはフィールドがSitecoreアイテムフィールドから直接供給されるか、または計算フィールドです。計算フィールドを使用すると、いくつかの計算を実行して結果をフィールドに格納するコードを記述できます。このコードは、索引が照会されたときではなく 、索引が構築/更新されたときに実行されます。これは、フィールドなどの集計データを格納する必要がある場合などに特に便利です。
<fieldMap>
要素内には、直接ソースフィールドと計算フィールドをそれぞれ含む<fieldNames hint="raw:AddFieldByFieldName">
& <fields hint="raw:AddComputedIndexField">
要素が表示されます。
戦略
インデックスの戦略によって、インデックスがいつ更新されるかが決まります。選択できるオプションは次のとおりです。
- OnPublishEndAsynchronousStrategy(onPublishEndAsync) - 項目が公開されると、インデックスは非同期に更新されます。
- SynchronousStrategy(syncMaster) - アイテムが保存されると、インデックスは瞬時に同期して更新されます。
- IntervalAsynchronousStrategy(intervalAsyncCore / intervalAsyncMaster) - アイテムの更新を定期的にチェックし、インデックスを非同期に更新する
- ManualStrategy - 自動インデックス更新はありません。インデックスは手動でのみ更新されます(コントロールパネルまたはプログラムによって)
- RebuildAfterFullPublishStrategy(rebuildAfterFullPublish) - パブリッシュ後、インデックスは完全にリビルドされます
- RemoteRebuildStrategy(remoteRebuild) - この戦略は、Sitecoreの複数インスタンス用です。たとえば、リビルドがコンテンツ管理サーバーから呼び出された場合、リモートコンテンツ配信サーバーはこのイベントにサブスクライブし、独自のインデックスを再構築します。
デフォルトでは、マスターインデックスはsyncMaster
として設定されていsyncMaster
。これは、エクスペリエンスエディタでアイテムを保存していて、ページのレンダリングでインデックスの結果が表示されている場合は、アイテムの変更内容をすぐに結果に表示する必要があるからです。 Webインデックスは 'onPublishEndAsync'として設定されます。これは、Webデータベースのインデックスは、アイテムがマスターデータベースからWebに公開されるときに更新する必要があるためです。
複数の戦略を組み合わせることもできます。たとえば、コンテンツ管理(CM)とコンテンツ配信(CD)用に別々のSitecoreインスタンスがある場合、 onPublishEndAsync
をremoteRebuild
と組み合わせると、アイテムが公開されたときにCDインデックスが更新されるだけでなく、ユーザーがCMサーバーのコントロールパネルから再構築をトリガーします。
次の設定を使用して戦略を選択できます。
<strategies hint="list:AddStrategy">
<strategy ref="contentSearch/indexConfigurations/indexUpdateStrategies/onPublishEndAsync" />
</strategies>
クローラ
これにより、インデックスを作成するSitecoreデータの場所を指定できます。 Webインデックスには、次のデフォルト設定があります。
<locations hint="list:AddCrawler">
<crawler type="Sitecore.ContentSearch.SitecoreItemCrawler, Sitecore.ContentSearch">
<Database>web</Database>
<Root>/sitecore</Root>
</crawler>
</locations>
重要な2つのビットは<Database>
<Root>
要素と<Root>
要素です。 <Root>
要素では、インデックスがインデックス化するSitecoreツリーの開始位置を指定できます。実際には、コンテンツノードの下にこれを指し示す「ホーム」ノードを持つ可能性が高いので、テンプレートなどではなく実際のコンテンツ/ページのみを索引付けします。
検索用のインバウンドフィルタを作成する
受信フィルタは、アイテムが検索インデックスに追加されたときに適用され、アイテムがインデックスに含まれるかどうかを指定できます。
インバウンドフィルターを使用できる例 - 標準値およびその項目の以前のバージョンを索引に含めないでください。
受信フィルタは設定で設定されます。
<indexing.filterIndex.inbound>
<processor type="Sitecore.ContentSearch.Pipelines.IndexingFilters.ApplyInboundIndexFilter, Sitecore.ContentSearch"></processor>
</indexing.filterIndex.inbound>
コードの実装:
public class ApplyInboundIndexVersionFilter : InboundIndexFilterProcessor
{
public override void Process(InboundIndexFilterArgs args)
{
var item = args.IndexableToIndex as SitecoreIndexableItem;
if (!item.Item.Versions.IsLatestVersion())
{
args.IsExcluded = true;
}
}
}
検索用の送信フィルタを作成する
送信フィルタを使用して検索結果をフィルタリングすることができます。
アウトバウンドフィルタの使用例の1つは、ユーザーが検索結果からアクセスできないアイテムを削除することです。
アウトバウンドフィルタが設定で設定されます。
<indexing.filterIndex.outbound>
<processor type="Sitecore.ContentSearch.Pipelines.IndexingFilters.ApplyOutboundSecurityFilter, Sitecore.ContentSearch"></processor>
</indexing.filterIndex.outbound>
送信フィルタの実装例:
public class ApplyOutboundIndexWorkflowFilter : OutboundIndexFilterProcessor
{
public override void Process(OutboundIndexFilterArgs args)
{
//You can use args.IsExcluded to remove items from the search results here
}
}
新しいバージョンを追加するときに、インデックス内のアイテムの以前のバージョンをすべて削除する
デフォルトでは、Sitecoreはアイテムのすべてのバージョンをsitecore_master_indexに追加します。その欠点は、ユーザーがワークフローを使用して多数のバージョンを追加している場合、それらのすべてがコンテンツエディタの検索結果に追加されるということです。
構成:
<event name="item:versionAdded" >
<handler type="FilterPatch.Library.ContentSearch.EventHandler, AssemblyName" method="Execute" />
</event>
ハンドラの実装
public class EventHandler
{
public void Execute(object sender, EventArgs eventArgs)
{
var item = Event.ExtractParameter(eventArgs, 0) as Item;
//If item has less than 2 versions - then skip
if(item.Versions.Count < 2)
{
return;
}
var indexableItem = new SitecoreIndexableItem(item);
var index = ContentSearchManager.GetIndex(indexableItem);
using (var context = index.CreateDeleteContext())
{
foreach(var version in item.Versions.GetVersions(true))
{
if(!version.Versions.IsLatestVersion())
{
var indexableItemVersion = new SitecoreIndexableItem(version);
context.Delete(indexableItemVersion.UniqueId);
}
}
context.Commit();
}
}
}