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

Lucene 找出maxClauseCount设置为1024错误的原因,lucene,lucene.net,Lucene,Lucene.net,我有两组搜索索引。 TestIndex(用于我们的测试环境)和ProdIndex(用于生产环境)。 Lucene搜索查询:+date:[20090410184806到20091007184806]对于测试索引可以正常工作,但是对于Prod索引给出了此错误消息 “maxClauseCount设置为1024” 若我在执行搜索查询之前执行下面的行,那个么我不会得到这个错误。 BooleanQuery.SetMaxClauseCount(Int16.MaxValue); searcher.Search(

我有两组搜索索引。 TestIndex(用于我们的测试环境)和ProdIndex(用于生产环境)。 Lucene搜索查询:+date:[20090410184806到20091007184806]对于测试索引可以正常工作,但是对于Prod索引给出了此错误消息

“maxClauseCount设置为1024”

若我在执行搜索查询之前执行下面的行,那个么我不会得到这个错误。 BooleanQuery.SetMaxClauseCount(Int16.MaxValue); searcher.Search(myQuery,collector)


我是不是遗漏了什么?为什么我没有在测试索引中得到这个错误?两个索引的架构是相同的。它们只是在记录数/数据数上有所不同。PROD index的记录数(大约1300)比测试一中的记录数(大约950)要多。

范围查询基本上被转换为布尔查询,每个可能的值都有一个子句,我们一起学习

例如,query+price:[10到13]被转换为布尔查询

+(price:10 price:11 price:12 price:13)
假设索引中存在所有值10-13


我想,你所有的1300个值都在你给出的范围内。因此,布尔查询有1300个子句,高于默认值1024。在测试索引中,没有达到1024的限制,因为只有950个值。

我也有同样的问题。我的解决方案是捕获BooleanQuery.ToomanyClause并动态增加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;
        }
    }
}
我在使用Sitecore web内容管理系统运行的C#代码中遇到了同样的问题。我使用了上面Randy的答案,但无法使用系统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;
}

只需输入,
BooleanQuery.setMaxClauseCount(Integer.MAX_值)就这样。

添加此代码

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

谢谢沙希坎特的回答。解决这个问题的办法是什么?BooleanQuery.SetMaxClauseCount(Int16.MaxValue);这应该是一个非常昂贵的电话。谢谢。缺点是查询的性能会随着唯一时间戳的计数而降低。但是,情况并没有那么糟。你可以试一试,看看表演是否可以接受。你应该会没事的。Lucene 2.9(Java)极大地改进了范围查询。我不确定何时会将其移植到.Net版本。同时,还有其他一些技巧可用于日期查询。通常,它包括将日期分为年、月和日。这需要大量的工作才能将用户查询转换为底层的lucene格式。尝试搜索“lucene日期查询”以获得有趣的想法。同时,您可以以不同的方式设计您的日期字段-您可以将其限制为一年中的几天吗?(因此将其限制为365个值)?或者将数据拆分为年、月和日,并使用更复杂的查询?我知道这是不雅观的,但它可能会起作用。这是一个很好的解决方案,但是为什么不在捕获异常之前计算子句并正确设置它呢?如果处理大量数据,这会影响性能吗?南市,原因是无法计算。在执行查询之前,无法确定该范围中包含了多少项,但随后该查询将转换为布尔查询并引发异常。谢谢Randy!我有一个不同的例子,我自己构造布尔查询,所以在运行搜索之前我能够计算它。我在使用Sitecore web内容管理系统运行的C#代码中遇到了同样的问题。我无法使用系统获取和设置属性功能,但我可以获取当前计数,增加它并将其设置回原位。我将在下面添加我的代码作为一个新的答案。你能解释一下为什么这会有帮助吗?