Sitecore 7 以降ではコンテンツアイテム検索用のプロバイダーとして Lucene に加えて Solr 用の検索プロバイダーが標準で提供されるようになりました。今回は Solrを使用してコンテンツを検索するようにセットアップする手順を記載しました。 簡単にセットアップを行うために Solrの設定は Solrのサンプルを流用します。Solrをサイトコアで使用できるようにする設定の詳細に関しては SDN の下記Sitecore Search Scaling Guideをご参照下さい。

Sitecore Search Scaling Guide
http://sdn.sitecore.net/Reference/Sitecore%207/Sitecore%20Search%20and%20CMS%20Scaling%20Guide.aspx

検証環境は次の通りです

  • Windows Server 2012にSitecore 7.1 がインストールされた オールインワン環境
  • Solr 4.6.0
  • java 1.7 update 45
  • Ninject 3.0.0.15

Solr のセットアップは記載していません。http://lucene.apache.org/solr/のページの右上の Download のページからダウンロードした zip を展開します。今回は現時点で最新の Solr 4.6.0 を使用します。Solr 4.6.0 のインストール方法の詳細はWeb上のページや[Solr] Solr をセットアップするメモを参照してください。今回は 下図のように C:\ドライブ直下に配置しました。

1. インデックス作成用のコアの定義

今回は Solr のサンプルを流用して Sitecore との連携できるようにします。下図のように example\solr 配下にある collection1 フォルダをコピーして itembuckets という名前を作成します。

itembuckets フォルダー直下の core.properties ファイルを編集して name=itembuckets にします。

この時点でとりあえず確認してみます。コマンドプロンプトを起動し、 example フォルダーに移動します。下記コマンドを実行して solr を起動します。

java -jar start.jar

ブラウザーを起動して http://localhost:8983/solr/ にアクセスします。画面が表示されることおよび、core selector に下図のように itembuckets というコアが表示されることを確認します。その他 Logging をクリックしてエラーが発生していないことも確認してください。

2.スキーマファイルの作成

fieldType が定義された ベースとなる scheme.xml ファイルをもとに Sitecore が使用する フィールド情報を定義した scheme.xml を生成します。

Sitecoreデスクトップを表示し、Sitecore の Control Panel → Indexing → Generate the Scheme.xml file をクリックします。

Wizard の Setup 画面で、ベースとして使用する Scheme.xml と出力先を指定します。 Source File にはコピーした itembuckets フォルダーの conf フォルダにある scheme.xml を設定しています。Generate ボタンをクリックします。

Scheme.xml ファイルが生成されます。

ソース ファイルとして使用した scheme.xml の <fields>の定義と <uniquekey>がサイトコア用のフィールドとキー情報に置換されます。 トークナイザーの設定をカスタマイズしたい場合は、 フィールドタイプの定義をカスタマイズしておくか、生成された scheme.xmlをカスタマイズしてください。

作成した scheme.xml を itembuckts\conf\ scheme.xmlに上書き保存します。 必要であれば置換前の scheme.xml のバックアップを取っておいてください。

itembuckets\conf\solrconfg.xml を編集します。<requestHandler name="/select" class="solr.SearchHandler"> タグの<lst name="defaults"> の子要素の最後に<bool name="terms">true</bool> を追加します。上述した lst name="defaults" 要素の後に次のタグを追加しておきます。

<arr name="last-components">
  <str>terms</str>
</arr>

最終的に次のような設定になります

     <lst name="defaults">
       <str name="echoParams">explicit</str>
       <int name="rows">10</int>
       <str name="df">text</str>
       <bool name="terms">true</bool>
     </lst>
     <arr name="last-components">
       <str>terms</str>
     </arr>

Solrを終了して、再起動します。http://localhost:8983/solr/ にアクセスして  エラーが発生しないことを確認してください。下図のように core selector で itembuckets をクリックして エラーが発生していないことを確認してください。そのほか Logging をクリックしてエラーが発生していないことも確認します。

3. Sitecore で Solr を検索プロバイダーとして使用する設定を行う

Sitecore CMS 7.1 のダウンロードページの Additional Tools にある  Solr support package をダウンロードします。Sitecore のバージョンに一致する support package を使用してください。現時点で 最新版を使用しているので、Sitecore.Solr.Support 1.0.0 rev. 130924.zip を使用します。ダウンロードした zip ファイルを展開します。展開されたフォルダに配置されたdllをWebsite/bin フォルダーに配置します。

Sitecore Search Scaling Guideを参照すると IOC Container ごとに 必要な dll の情報が記載されていますが、ここでは何も考えずに bin フォルダ内の dll を全てサイトコアの Website\bin フォルダーにコピーしておきます。

今回は Solr Providerで使用する IOC Container として Ninject を使用することにします。理由は私がプライベートで使用しているからです。それだけです。各自普段使い慣れているものを選択してください。

ninject のdllをダウンロードします。 http://www.ninject.org/download.html にアクセスします。Ninject のダウンロードページから、.NET 4.5 用のビルドをダウンロードします。今回は記事作成時点で最新の Ninject-3.0.0.15-release-net-4.5.zip という zip をダウンロードしました。zipを展開し、Ninject.dll と extensions フォルダーにある CommonServiceLocator.NinjectAdapter.dll を サイトコアの Website\bin にコピーします。

次に Lucene を検索プロバイダーとして使用する設定を無効化します。下図のように App_Config\Include フォルダにあるSitecore.ContentSearch.Lucene.*.config ファイルを無効化します(拡張子を config 以外にします。)。

続いて、 Solr support package 内のApp_Config/Include/Sitecore.ContentSearch.Solr.Indexes.configをWebsite/App_Config/Include に配置します。

Sitecore.ContentSearch.Solr.Indexes.configを編集します。必要に応じて ContentSearch.Solr.ServiceBaseAddress を変更します。下記はデフォルトです。今回はSolrをローカルにデフォルトの設定を使用してインストールしているので変更しません。

<setting name="ContentSearch.Solr.ServiceBaseAddress" value="http://localhost:8983/solr" />

同ファイル内の ContentSearch.Provider が Solr であることを確認します。(既定値です。)

<setting name="ContentSearch.Provider" value="Solr" />

Solrでコア名を itembuckets 以外で作成した場合は、適宜 config ファイルを編集してください。詳細はSitecore Search Scaling Guideを参照してください。

最後にGlobal.asax を変更します。使用する IOC Container の種類に合わせて変更して下さい。今回は Ninject を使用するため、Globa.asax の ディレクティブ

<%@Application Language='C#' Inherits="Sitecore.Web.Application" %>

を次のように編集します。

<%@Application Language='C#' Inherits="Sitecore.ContentSearch.SolrProvider.NinjectIntegration.NinjectApplication" %>

変更したら Globa.asax を忘れずに保存してください。Ninject 以外の IOC コンテナを使用する場合の設定例は Sitecore Search Scaling Guide を参照してください。

ここまでで設定の完了です。 サイトコアとSolrを再起動します。

4. インデックスの作成

Sitecore で Solr を使用する設定を行ったのでインデックスをリビルドします。 サイトコアデスクトップにログインし、 Control Panle → Indexing → Indexing Manager をクリックします。

リビルドするインデックスを選択して、 Rebuild ボタン をクリックします。

インデックスのリビルドが完了すると次のような画面が表示されます。インデックス速度は ディスクの速度に依存します。終了画面にうまく遷移しない場合は、アプリケーションプールを一度リサイクルしてみてください。

Solrの管理画面で itembuckts の Over View を見ると どれだけのドキュメントが格納されている確認できます。

DefaultLanguage を en (英語) 以外にした場合の Solrのコンフィグレーションの変更点に介してはSitecore Search Scaling GuideのExample:Updating the default language analyzer in Solr を参照してください。

5.まとめ

説明は以上です。間違いや指摘点などございましたらご連絡ください。未知の単語を辞書に追加する方法は[Solr] ユーザー辞書に単語を追加するを参照してください。

日本語を使用する場合の注意点を記載します。Sitecore 7以降で導入された サイトコアの検索タブを使用してアイテムを検索する場合 既定(マッチングするフィールドを指定しない場合) _content フィールドに対してマッチングを行います。_content フィールドのフィールドタイプは text_general になっています。Solrのサンプルでは text_general は StandardAnalyzer を使用するようにトークナイザーが設定されています。日本語をメインに使用される環境の場合は text_general フィールドのトークナイザーを text_ja と同じ定義に変更したり、_content フィールドのフィールドタイプを text_ja に変更するなどして適宜スキーマをカスタマイズしたほうがよいと思います。

2014/07/13 追記
Solr 4.8 からソースファイルとして利用した schema.xml ファイルのフォーマットが変更されています。 4.7以前の書式に戻してスキーマファイルを生成すると引き続き SolrとSitecoreを連携させることができると思います。