Изменение метода перезаписи
Bajafresh4life предложил позвонить setRewriteMethod
.Однако, это не то, как вы меняете это в Lucene.Net.Вот как это сделать в C #:
По умолчанию каждый PrefixQuery
возвращается методом NewPrefixQuery
из QueryParser
примерно так:
protected internal virtual Query NewPrefixQuery(Term prefix)
{
return new PrefixQuery(prefix) { RewriteMethod = multiTermRewriteMethod };
}
Вы можете изменить это послесоздание экземпляра вашего синтаксического анализатора с помощью свойства set
QueryParser.MultiTermRewriteMethod
, например:
var parser = new QueryParser( Version.LUCENE_30, field, analyzer );
parser.MultiTermRewriteMethod = MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE;
Обратите внимание, что это изменит поведение и для других запросов, а не только для запроса префикса.Чтобы повлиять только на запрос префикса, вы можете создать подкласс QueryParser
и переопределить NewPrefixQuery
, чтобы конструктор для возвращенного PrefixQuery
использовал выбранный вами метод перезаписи.
Какой метод перезаписи использовать
Это, кажется, не исправило это для меня, хотя.Мне на самом деле повезло больше, используя MultiTermQuery.CONSTANT_SCORE_BOOLEAN_QUERY_REWRITE
.В описании этого метода написано
Как и SCORING_BOOLEAN_QUERY_REWRITE, за исключением того, что баллы не вычисляются.Вместо этого каждый соответствующий документ получает постоянную оценку, равную ускорению запроса.
Но это может быть потому, что я также подклассифицировал PrefixQuery
и переопределил ReWrite
, чтобы назначить оценки, которые я хочу увеличить.
После значительной отладки я в конце концов понял, что, пытаясь использовать SCORING_BOOLEAN_QUERY_REWRITE
, DefaultSimilarity.QueryNorm
мешал моим оценкам, когда возвращаемое значение используется в Weight.Normalize
, чтопозвонил Query.Weight
.