在Solr/Lucene中删除低于某个分数阈值的结果?

sni*_*net 12 lucene solr

solr/lucene中是否有内置功能可以在结果低于某个分数阈值时过滤结果?假设我提供的得分阈值为.2,那么得分低于.2的所有文档都将从我的结果中删除.我的直觉是,这可以通过更新/定制solr或lucene来实现.

你能指出我如何做到这一点的正确方向吗?

提前致谢!

sis*_*sve 8

您可以编写自己的收集器,忽略收集得分者低于阈值的那些文档.下面是一个使用Lucene.Net 2.9.1.2和C#的简单示例.如果要保留计算得分,则需要修改示例.

using System;
using System.Collections.Generic;
using Lucene.Net.Index;
using Lucene.Net.Search;

public class ScoreLimitingCollector : Collector {
    private readonly Single _lowerInclusiveScore;
    private readonly List<Int32> _docIds = new List<Int32>();
    private Scorer _scorer;
    private Int32 _docBase;

    public IEnumerable<Int32> DocumentIds {
        get { return _docIds; }
    }

    public ScoreLimitingCollector(Single lowerInclusiveScore) {
        _lowerInclusiveScore = lowerInclusiveScore;
    }

    public override void SetScorer(Scorer scorer) {
        _scorer = scorer;
    }

    public override void Collect(Int32 doc) {
        var score = _scorer.Score();
        if (_lowerInclusiveScore <= score)
            _docIds.Add(_docBase + doc);
    }

    public override void SetNextReader(IndexReader reader, Int32 docBase) {
        _docBase = docBase;
    }

    public override bool AcceptsDocsOutOfOrder() {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)


ken*_*orb 5

它被称为标准化分数(分数为百分比).

您可以使用以下参数来实现:

ns = {!func}product(scale(product(query({!type=edismax v=$q}),1),0,1),100)
fq = {!frange l=20}$ns
Run Code Online (Sandbox Code Playgroud)

20是你20%的门槛.

相关:如何规范solr/lucene得分?


我不建议这样做,因为Lucene中的绝对分数值没有意义(例如,分数在搜索中不能直接比较).返回的得分与最高得分的比率是有意义的,但至少目前没有对返回的最高得分进行绝对校准,因此无法从得分中确定结果集的质量总体如何.已经讨论过各种改进方法(通过将额外信息编码到分数中并将其用于规范化,或者可能更好地将分数推广到包含多条信息的对象,使分数更直接可比;例如,如果您使用默认OR,则最高结果匹配的查询字词总数将非常有用).据我所知,这些想法都没有实施. - @Chuck

来源:RE:限制命中阈值

相关:Re:关于Lucene评分功能的问题