【Solrエラー対応】TooManyClauses: maxClauseCount is set to 1024

Solrで大量のAND条件でクエリ投げた場合などに以下のようなエラーが発生する場合があります。これを調査しました。

org.apache.lucene.search.BooleanQuery$TooManyClauses: maxClauseCount is set to 1024

BooleanQueryの制限値があるというエラーなのですが、

solrconfig.xmlのこの値、確かに1024なのでこれ調整すればいけそうです。

  <query>
    <!-- Maximum number of clauses in a boolean query... in the past, this affected
        range or prefix queries that expanded to big boolean queries - built in Solr
        query parsers no longer create queries with this limitation.
        An exception is thrown if exceeded.  -->
    <maxBooleanClauses>1024</maxBooleanClauses>

しかしこの値を例えば2048に変更しても、変更が適用されずに maxClauseCount is set to 1024 のメッセージのまま。

個人的には落とし穴的な仕様だと思ったので、メモ残しておきます。      

この制限自体はLuceneのBooleanQueryに含まれます。

lucene-solr/BooleanQuery.java at releases/lucene-solr/6.6.0 · apache/lucene-solr · GitHub

Default値はSolrのデフォルト設定と同じで1024。

private static int maxClauseCount = 1024;

この関数で設定されているようです。

  public static void setMaxClauseCount(int maxClauseCount) {
    if (maxClauseCount < 1) {
      throw new IllegalArgumentException("maxClauseCount must be >= 1");
    }
    BooleanQuery.maxClauseCount = maxClauseCount;
  }

Solr側のコードみるとここ。  

https://github.com/apache/lucene-solr/blob/releases/lucene-solr/6.6.0/solr/core/src/java/org/apache/solr/core/SolrCore.java#L243-L255

  static int boolean_query_max_clause_count = Integer.MIN_VALUE;
  
  // only change the BooleanQuery maxClauseCount once for ALL cores...
  void booleanQueryMaxClauseCount()  {
    synchronized(SolrCore.class) {
      if (boolean_query_max_clause_count == Integer.MIN_VALUE) {
        boolean_query_max_clause_count = solrConfig.booleanQueryMaxClauseCount;
        BooleanQuery.setMaxClauseCount(boolean_query_max_clause_count);
      } else if (boolean_query_max_clause_count != solrConfig.booleanQueryMaxClauseCount ) {
        log.debug("BooleanQuery.maxClauseCount={}, ignoring {}", boolean_query_max_clause_count, solrConfig.booleanQueryMaxClauseCount);
      }
    }
  }

staticで値持っている(全コア共通の設定)、かつ全コア共通で最初に設定された値が正となる仕様でした。 ということで、複数コアで運用している場合は、一番最初に読み込まれたコアの値が優先されますので注意が必要です。設定変更の適用にはSolr再起動も必要です。