выяснение причины для maxClauseCount установлен в 1024 ошибка - PullRequest
16 голосов
/ 08 октября 2009

У меня есть два набора поисковых индексов. TestIndex (используется в нашей тестовой среде) и ProdIndex (используется в среде PRODUCTION). Поисковый запрос Lucene: + date: [20090410184806 TO 20091007184806] отлично работает для тестового индекса, но выдает это сообщение об ошибке для индекса Prod.

"maxClauseCount установлен на 1024"

Если я выполню следующую строку непосредственно перед выполнением поискового запроса, я не получу эту ошибку. BooleanQuery.SetMaxClauseCount (Int16.MaxValue); искатель. Поиск (myQuery, сборщик);

Я что-то здесь упускаю? Почему я не получаю эту ошибку в тестовом индексе? Схемы для двух индексов одинаковы. Они отличаются только количеством записей / данных. Индекс PROD имеет большее количество записей (около 1300), чем в тестовом (около 950) .

Ответы [ 5 ]

12 голосов
/ 05 ноября 2009

У меня была такая же проблема. Моим решением было перехватить BooleanQuery.TooManyClauses и динамически увеличить maxClauseCount.

Вот код, похожий на тот, который у меня есть в производстве.

Удачи, Randy


    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;
            }
        }
    }
12 голосов
/ 08 октября 2009

Запрос диапазона по существу преобразуется в логический запрос с одним предложением для каждого возможного значения, ИЛИ вместе.

Например, запрос + цена: [от 10 до 13] преобразуется в логический запрос

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

при условии, что все значения 10-13 существуют в индексе.

Полагаю, все ваши 1300 значений находятся в заданном вами диапазоне. Таким образом, логический запрос содержит 1300 предложений, что превышает значение по умолчанию, равное 1024. В тестовом индексе предел 1024 не достигнут, поскольку имеется только 950 значений.

1 голос
/ 13 марта 2019

Добавить этот код

@using Lucene.Net.Search;
@BooleanQuery.SetMaxClauseCount(2048);
1 голос
/ 25 ноября 2015

У меня была такая же проблема в коде C #, работающем с системой управления веб-контентом Sitecore. Я использовал ответ Рэнди выше, но не смог использовать функцию получения и установки свойства System. Вместо этого я получил текущий счетчик, увеличил его и установил обратно. Работал отлично!

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 голосов
/ 18 января 2016

Просто поставь, BooleanQuery.setMaxClauseCount( Integer.MAX_VALUE ); и все.

...