Помочь необходимо выяснить причину maxClauseCount устанавливается ошибка 1024
У меня есть два набора индексов поиска. TestIndex (используется в нашей тестовой среде) и ProdIndex(используется в производственной среде). Поисковый запрос Lucene: + дата: [20090410184806-20091007184806] отлично работает для тестового индекса, но дает это сообщение об ошибке для индекса Prod.
"maxClauseCount имеет значение 1024"
Если я выполните следующую строку непосредственно перед выполнением запроса, то я не получаю эту ошибку. BooleanQuery.SetMaxClauseCount(Типа INT16.Максвеллову); искатель.Поиск(myQuery, коллекционер);
Я что-то пропустил?Почему я не получаю эту ошибку в тестовом индексе?Схема для двух индексов одинакова.Они отличаются только в зависимости от количества записей/данных.Индекс PROD имеет большее количество записей(около 1300), чем в тестовом (около 950).
Спасибо за чтение.
4 ответов
запрос диапазона по существу преобразуется в логический запрос с одним предложением для каждого возможного значения, ORed вместе.
например, запрос + price: [10 до 13] преобразуется в логический запрос
+(price:10 price:11 price:12 price:13)
предполагая, что все значения 10-13 существуют в индексе.
Я полагаю, что все ваши 1300 значений попадают в диапазон, который вы дали. Таким образом, логический запрос имеет 1300 предложений, что выше значения по умолчанию 1024. В тестовом индексе предел 1024 не достигается, так как есть только 950 значений.
У меня была та же проблема. Моим решением было поймать BooleanQuery.TooManyClauses и динамически увеличить maxClauseCount.
вот некоторый код, который похож на то, что у меня есть в производстве.
Удачи, Рэнди!--2-->
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;
}
}
}
У меня была такая же проблема в коде C#, работающем с системой управления веб-контентом Sitecore. Я использовал ответ Рэнди выше, но не смог использовать функциональность свойств системы get и set. Вместо этого я восстановил текущий счет, увеличил его и вернул обратно. Отлично сработало!
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;
}