Помощь, необходимая для выяснения причины, по которой maxClauseCount имеет значение 1024 ошибки

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

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

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

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

Спасибо за чтение.

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Удачи, Ренди


    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;
            }
        }
    }

Ответ 3

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

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;
}

Ответ 4

Просто поместите BooleanQuery.setMaxClauseCount( Integer.MAX_VALUE ); и это.