我遇到了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;
}
}
}
答案 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来恢复文档提升。