figuring out reason for maxClauseCount is set to 1024 error

后端 未结 5 1643
萌比男神i
萌比男神i 2021-02-18 15:35

I\'ve two sets of search indexes. TestIndex (used in our test environment) and ProdIndex(used in PRODUCTION environment). Lucene search query: +date:[20090410184806 TO 200910071

相关标签:
5条回答
  • 2021-02-18 15:59

    The range query essentially gets transformed to a boolean query with one clause for every possible value, ORed together.

    For example, the query +price:[10 to 13] is tranformed to a boolean query

    +(price:10 price:11 price:12 price:13)
    

    assuming all the values 10-13 exist in the index.

    I suppose, all of your 1300 values fall in the range you have given. So, boolean query has 1300 clauses, which is higher than the default value of 1024. In the test index, the limit of 1024 is not reached as there are only 950 values.

    0 讨论(0)
  • 2021-02-18 16:01

    I had the same problem. My solution was to catch BooleanQuery.TooManyClauses and dynamically increase maxClauseCount.

    Here is some code that is similar to what I have in production.

    private static Hits searchIndex(Searcher searcher, Query query) throws IOException
    {
        boolean retry = true;
        while (retry)
        {
            try
            {
                retry = false;
                Hits myHits = searcher.search(query);
                return myHits;
            }
            catch (BooleanQuery.TooManyClauses e)
            {
                // Double the number of boolean queries allowed.
                // The default is in org.apache.lucene.search.BooleanQuery and is 1024.
                String defaultQueries = Integer.toString(BooleanQuery.getMaxClauseCount());
                int oldQueries = Integer.parseInt(System.getProperty("org.apache.lucene.maxClauseCount", defaultQueries));
                int newQueries = oldQueries * 2;
                log.error("Too many hits for query: " + oldQueries + ".  Increasing to " + newQueries, e);
                System.setProperty("org.apache.lucene.maxClauseCount", Integer.toString(newQueries));
                BooleanQuery.setMaxClauseCount(newQueries);
                retry = true;
            }
        }
    }
    
    0 讨论(0)
  • 2021-02-18 16:06

    I had this same issue in C# code running with the Sitecore web content management system. I used Randy's answer above, but was not able to use the System get and set property functionality. Instead I retrieved the current count, incremented it, and set it back. Worked great!

    catch (BooleanQuery.TooManyClauses e)
    {
        // Increment the number of boolean queries allowed.
        // The default is 1024.
        var currMaxClause = BooleanQuery.GetMaxClauseCount();
        var newMaxClause = currMaxClause + 1024;
        BooleanQuery.SetMaxClauseCount(newMaxClause);
        retry = true;
    }
    
    0 讨论(0)
  • 2021-02-18 16:12

    Add This Code

    @using Lucene.Net.Search;
    @BooleanQuery.SetMaxClauseCount(2048);
    
    0 讨论(0)
  • 2021-02-18 16:17

    Just put, BooleanQuery.setMaxClauseCount( Integer.MAX_VALUE );and that's it.

    0 讨论(0)
提交回复
热议问题