コンテンツ ツリー検索の速度が遅くなりOutOfMemoryExceptionが発生する場合がある


解説

コンテンツ ツリー検索のパフォーマンスは、検索インデックスで格納されたデータのサイズに依存します。検索条件の範囲があまりにも広すぎると、検索作業に数十秒かかったり、極端な場合には未処理の例外が検索操作で発生する場合があります。この場合、ログに以下のメッセージが出力されます:

ERROR Invalid search query: sitecore
Exception: System.OutOfMemoryException
Message: Exception of type 'System.OutOfMemoryException' was thrown.
Source: mscorlib
   at System.Text.StringBuilder.ToString()
   at SolrNet.Impl.SolrConnection.ReadResponseToString(IHttpWebResponse response)
   at SolrNet.Impl.SolrConnection.GetResponse(IHttpWebRequest request)
   at SolrNet.Impl.SolrConnection.Get(String relativeUrl, IEnumerable`1 parameters)
   at SolrNet.Impl.SolrQueryExecuter`1.Execute(ISolrQuery q, QueryOptions options)
   at Sitecore.ContentSearch.SolrProvider.LinqToSolrIndex`1.ExecuteQuery(SolrCompositeQuery compositeQuery, QueryOptions options)
   at Sitecore.ContentSearch.SolrProvider.LinqToSolrIndex`1.FindElements[TElement](SolrCompositeQuery compositeQuery)
   at Sitecore.ContentSearch.Linq.Parsing.IndexQueryable`2.GetEnumerator()
   at System.Linq.Enumerable.<TakeWhileIterator>d__27`1.MoveNext()
   at Sitecore.ContentSearch.Client.Pipelines.Search.SearchContentSearchIndex.ExecuteQuery(SearchArgs args, IQueryable`1 query)
   at Sitecore.ContentSearch.Client.Pipelines.Search.SearchContentSearchIndex.PerformSearch(SearchArgs args)

解決策

オプション1

ContentSearch.SearchMaxResults設定値を減らし、レスポンスに含まれる検索結果の最大数を制限します。\App_Config\Include\zzzフォルダに設定パッチ ファイルを作成し、設定値を500以下にしていただくことをお薦めします。

例:

<?xml version="1.0" encoding="utf-8" ?>
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/" xmlns:set="http://www.sitecore.net/xmlconfig/set/" xmlns:role="http://www.sitecore.net/xmlconfig/role/" >
  <sitecore role:require="Standalone or ContentManagement">
    <settings>
      <setting name="ContentSearch.SearchMaxResults" set:value="500" />
    </settings>
  </sitecore>
</configuration>

この変更は、Sitecoreで生成されるすべての検索クエリに影響を与える点にご注意ください。なお、貴社アプリケーションのロジックが、1つのリクエストで(上記で設定した値より)多くの結果を取得することを前提とした設計ではないことを確認してください。

オプション2

コンテンツ ツリー検索の代わりに、検索タブを使用します。検索タブでは、必要に応じて検索結果をロードするページング機能を使用しています。検索タブはデフォルトで1つの検索要求に対して20件を返すことになります。

なお、検索タブでは、検索範囲が選択されたアイテムのサブツリーに制限されます。Content Tree全体を検索するには、/sitecoreルート アイテムを選択します。

オプション3

この問題を解決するには、以下の選択肢のいずれかを検討してください。