lucene 找出maxClauseCount设置为1024错误的原因

zujrkrfu  于 2022-11-07  发布在  Lucene
关注(0)|答案(5)|浏览(268)

我有两组搜索索引。TestIndex(用于我们的测试环境)和ProdIndex(用于PRODUCTION环境)。Lucene搜索查询:+date:[20090410184806 TO 20091007184806]对于测试索引工作正常,但对于生产索引则出现此错误消息。
“maxClauseCount已设定为1024”
如果我在执行搜索查询之前执行下面的代码行,则不会收到此错误。搜索器。搜索(myQuery,收集器);
我在这里遗漏了什么吗?为什么在测试索引中没有得到这个错误?两个索引的架构是相同的。它们只是在记录/数据的数量上有所不同。PROD索引的记录数量(大约1300)比测试一中的记录数量(大约950)要多。

dgsult0t

dgsult0t1#

添加此代码

@using Lucene.Net.Search;
@BooleanQuery.SetMaxClauseCount(2048);
ia2d9nvy

ia2d9nvy2#

只要输入,BooleanQuery.setMaxClauseCount( Integer.MAX_VALUE );,就可以了。

pxy2qtax

pxy2qtax3#

实际上,范围查询被转换为布尔查询,每个可能的值都有一个子句,并进行“或”运算。
例如,查询+price:[10 to 13]被转换为布尔查询

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

假设所有值10-13都存在于索引中。
我假设,您的1300个值都在您给定的范围内。因此,布尔查询有1300个子句,高于默认值1024。在测试索引中,由于只有950个值,因此没有达到1024的限制。

8ljdwjyq

8ljdwjyq4#

我遇到了同样的问题,我的解决方案是捕获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;
        }
    }
}
zzwlnbp8

zzwlnbp85#

我在使用Sitecore Web内容管理系统运行C#代码时遇到了同样的问题。我使用了上面Randy的答案,但无法使用系统的获取和设置属性功能。相反,我检索了当前计数,将其递增,然后将其设置回原来的值。

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

相关问题