выяснение причины maxClauseCount установлено на 1 024 ошибки

__ImageBase сгенерированный символ компоновщика, который является заголовком DOS модуля (только MSVC). От этого можно бросить его адрес к HINSTANCE или HMODULE. Таким образом, это более удобно, чем прохождение через API.

, Таким образом, просто необходимо сделать это:

EXTERN_C IMAGE_DOS_HEADER __ImageBase;
#define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase)

От https://devblogs.microsoft.com/oldnewthing/20041025-00/? p=37483

16
задан Cœur 8 January 2019 в 12:51
поделиться

2 ответа

Это часть SDK (.NET, или теперь Windows SDK )

[10-13] преобразуется в логический запрос

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

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

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

12
ответ дан 30 November 2019 в 21:28
поделиться

У меня была такая же проблема. Мое решение заключалось в том, чтобы поймать 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
ответ дан 30 November 2019 в 21:28
поделиться