言語について
Solrでアイテムを検索したときにはすべての言語がヒットしてしまいます。
context.GetQueryable<SearchResultItem>().Where(x => x.Language == Sitecore.Context.Language.Name);
上記の例はコンテキスト言語の言語のみで絞り込むように記載したものです。
言語の絞り込みを行わないとすべての言語がヒットしてしまい、日本語サイトなのに英語のコンテンツが存在したり、一覧の場合には一覧内に同じページの日本語と英語のアイテムへのリンクがそれぞれあるといった状態になってしまいます。
Solrを使用してアイテムを取得する際には言語を指定するようにしましょう。
バージョンについて
Solrでアイテムを検索したときにはすべてのバージョンがヒットしてしまいます。
この事象はwebデータベースを参照している場合は問題ないのですが(webにはmasterからパブリッシュされた最新バージョンしか存在しないため)
masterデータベースを参照する場合や、プレビューでページを見る場合などには注意が必要です。
context.GetQueryable<SearchResultItem>().Where(x => x.IsLatestVersion);
上記の例は_latestversionという項目がtrueのもののみを絞り込むように記載したものです。
例えば、sampleItemというアイテムの数値バージョンに1, 2, 3を持っている場合、sampleItemの最新バージョンであるバージョン3のみに"_latestversion":trueがついています。
※この方法には下述したパブリッシュ制限を考える必要がある場合にはあまりオススメできない使い方です。
パブリッシュ制限について
こちらもmasterデータベースのみで発生する事象ですが、Solrでアイテムを検索したときにパブリッシュ制限を考慮した最新のアイテムが取得されません。
「バージョンについて」項で最新バージョンに"_latestversion":trueがつくという記載をしましたが、この項目はパブリッシュ制限の項目を無視してついています。
ですので、例えば、「バージョンについて」項で例にあげたsampleItemのバージョン3のパブリッシュ開始日が明日以降の場合webに公開されるのはバージョン2ですが、solrの項目にはバージョン3に"_latestversion":trueがつきます。
if(Sitecore.Configuration.State.Previewing)
{
// プレビュー日時で設定した時間
dateTime = Sitecore.Configuration.State.PreviewDate.ToLocalTime();
}
else
{
// 現在の時刻
dateTime = DateTime.Now;
}
context.GetQueryable<SearchResultItem>().Where(x => !x.NeverPublish)
.Where(x => x.Publish <= dateTime)
.Where(x => x.Unpublish >= dateTime || (x.Unpublish >= DateTime.MinValue && x.Unpublish <= DateTime.MinValue))
.Where(x => !x.HideVersion)
.Where(x => x.ValidFrom <= dateTime)
.Where(x => x.ValidTo >= dateTime || (x.ValidTo >= DateTime.MinValue && x.ValidTo <= DateTime.MinValue));
上記の例はすべてのパブリッシュ制限の項目を満たしたアイテムかどうかを判定し、絞り込むように記載したものです。
パブリッシュ制限は全部で6つの項目があります。
・アイテムのパブリッシュ禁止(パブリッシュ禁止フィールド[__Never publish])
・アイテムのパブリッシュ開始日(パブリッシュ期間 開始日時フィールド[__Publish])
・アイテムのパブリッシュ終了日(パブリッシュ期間 終了日時フィールド[__Unpublish])
・バージョンのパブリッシュ禁止(バージョンを非表示にするフィールド[__Hide version])
・バージョンのパブリッシュ開始日(開始日時フィールド[__Valid from])
・バージョンのパブリッシュ終了日(終了日時フィールド[__Valid to])
上記のフィールドが満たされたアイテムがwebへと公開されます。
プレビューは日時の指定が可能なため、プレビュー日時を変更し、その日にどのコンテンツが表示されるかを確認するといった用途などで使用するかと思います。
この時にsolrで上記の絞り込みをしていないと、プレビュー日時を変更してもコンテンツが変わらない、プレビュー日時に設定された日には公開されないはずのコンテンツが一覧に表示されているといった状態になってしまいます。
※補足として、上記の6フィールドはデフォルトだとsolrの項目に入らないフィールドとなっているため、読み込めるようにしてあげてください。
また今回紹介したlanguageと_latestversionの項目はデフォルトで持っている項目でありSitecoreがつけてくれる項目のためカスタムの必要はありません。
次回の投稿でデフォルトでsolrの項目に入らないフィールドの追加方法をご紹介します。
以上です。
※エントリーの内容・画像等は、公開時点での情報に基づきます。
※Sitecoreのバージョンによって実装されている機能が異なります。