Lucene - Эффект подсчета очков на счету предложений - PullRequest
2 голосов
/ 29 марта 2012

У меня были некоторые проблемы с Lucene, так как он всегда имел постоянную оценку и игнорировал мои значения буста.

Установка парсера rewriteMethod на SCORING_BOOLEAN_QUERY_REWRITE сделала свое дело, но у него есть странный побочный эффект на 'clauseCount', который я не совсем понимаю.

С постоянным подсчетом у меня нет проблем с maxClauseCount, который по умолчанию равен 1024. При динамическом подсчете clauseCount быстро превысил 1024, и мне действительно интересно, почему это так.

Кто-нибудь знает технические детали этого?

В другом посте кто-то упомянул, что запросы типа 'ca *' переписаны на 'car OR cars'. Но разве это не должно быть всегда, независимо от того, используете ли вы постоянную или динамическую оценку?

Заранее спасибо!

редактировать: Итак, вот мое решение. Я столкнулся с некоторыми проблемами, потому что значение повышения документа, которое я установил при создании документа, всегда было 1,0, когда я получил документ позже. Может быть, ошибка, я не уверен в этом. Что я знаю, так это то, что когда вы получаете документ от поисковика, объект документа создается заново, а значение повышения никогда не устанавливается. Просто поля. Может быть связано с портом C #. Во всяком случае, я написал CustomScoreQuery, который использует исходный запрос и умножает оценку на мое начальное значение повышения, которое я установил в поле документа (я знаю, что это неприятный обходной путь)

Хватит говорить, вот мой код. Я открыт для улучшений. Особенно там, где я мог получить исходное значение усиления без необходимости поиска или поля.

public class DynamicBoostingQuery : CustomScoreQuery
{
    private Searcher s;

    public DynamicBoostingQuery(Query q, Searcher searcher)
        : base(q)
    {
        this.s = searcher;
    }

    public override float CustomScore(int doc, float subQueryScore, float valSrcScore)
    {
        float val = base.CustomScore(doc, subQueryScore, valSrcScore);

        try
        {
            Document d = s.Doc(doc);

            float priority = float.Parse(d.Get("raw_categoryPriority"));

            return val * priority;
        }
        catch
        {
            return val;
        }        
    }
}

1 Ответ

1 голос
/ 29 марта 2012

MultiTermQuery по умолчанию (в Lucene 3.5 на Java, не знаю точную версию, которая была представлена) - CONSTANT_SCORE_AUTO_REWRITE_DEFAULT, которая использует CONSTANT_SCORE_BOOLEAN_QUERY_REWRITE только до определенного порога предложений и обращений и после этого переключается на CONSTANT_SCARTooManyClauses.Вы отвергли это и заставили Lucene использовать переписывание BooleanQuery.К сожалению, нет возможности использовать перезапись на основе фильтров, если вам нужен счет.

Возможно, вы можете попробовать использовать CustomScoreQuery для восстановления ваших документов.

...