Lucene - 对子句数的评分效果

时间:2012-03-29 11:10:44

标签: c# .net boost lucene scoring

我遇到了Lucene的一些问题,因为它总是有一个不变的分数而忽略了我的提升值。

将解析器rewriteMethod设置为SCORING_BOOLEAN_QUERY_REWRITE可以解决问题,但它对'clauseCount'有一个奇怪的副作用,我不太了解。

通过持续评分,我对maxClauseCount没有任何问题,默认情况下为1024。通过动态评分,clauseCount很快就超过了1024,我真的很想知道为什么会这样。

有谁知道这方面的技术细节?

在另一篇文章中,有人提到像'ca *'这样的查询被重写为'car OR cars'。但是,不管是否使用持续或动态评分,情况应该总是如此?

提前致谢!

修改 所以这是我的解决方案。我遇到了一些问题,因为我在创建文档时设置的文件提升值总是1.0,当我稍后获得文档时。也许是一个错误,我不确定这个。我所知道的是,当您从搜索者处获取文档时,文档对象是新创建的,并且永远不会设置提升值。只是田野。可能与C#端口有关。 无论如何,我编写了一个使用原始查询的CustomScoreQuery,并将得分乘以我在doc字段中设置的初始提升值(一个令人讨厌的解决方法,我知道)

够了,这是我的代码。我愿意改进。特别是我可以在不需要搜索者或场地的情况下获得原始提升值。

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 个答案:

答案 0 :(得分:1)

MultiTermQuery的默认值(在Java上的Lucene 3.5中,不知道引入的确切版本)是CONSTANT_SCORE_AUTO_REWRITE_DEFAULT,它仅使用CONSTANT_SCORE_BOOLEAN_QUERY_REWRITE达到定义的子句和命中阈值,并且超出切换到CONSTANT_SCORE_FILTER_REWRITE,从不引发TooManyClauses。你覆盖了那个并强迫Lucene使用BooleanQuery重写。不幸的是,如果你需要得分,就没有选择使用基于过滤器的重写。

也许您可以尝试使用CustomScoreQuery来恢复文档提升。