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

是否删除Solr/Lucene中低于某个分数阈值的结果?,lucene,solr,Lucene,Solr,如果结果低于某个分数阈值,solr/lucene中是否有内置功能来过滤结果?假设我提供的分数阈值为.2,那么分数小于.2的所有文档都将从我的结果中删除。我的直觉是,通过更新/定制solr或lucene,这是可能的 你能告诉我怎么做的正确方向吗 提前谢谢 您可以编写自己的收集器,该收集器将忽略收集记分员放在阈值以下的文档。下面是一个使用Lucene.NET2.9.1.2和C#的简单示例。如果希望保留计算的分数,则需要修改示例 using System; using System.Collectio

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

你能告诉我怎么做的正确方向吗


提前谢谢

您可以编写自己的收集器,该收集器将忽略收集记分员放在阈值以下的文档。下面是一个使用Lucene.NET2.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;
    }
}
使用系统;
使用System.Collections.Generic;
使用Lucene.Net.Index;
使用Lucene.Net.Search;
公共类ScoreLimitingCollector:收集器{
私有只读单_lowerInclusiveScore;
私有只读列表_docIds=new List();
私人记分员;
私有Int32_docBase;
公共IEnumerable文档ID{
获取{return\u docIds;}
}
公共计分限制收集器(单低分ClusiveScore){
_lowerInclusiveScore=lowerInclusiveScore;
}
公共覆盖无效设置记分器(记分器记分器){
_记分员=记分员;
}
公共覆盖无效收集(Int32文档){
var score=_score.score();

如果(_lowerInclusiveScore,则称为标准化分数()

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

ns = {!func}product(scale(product(query({!type=edismax v=$q}),1),0,1),100)
fq = {!frange l=20}$ns
其中20是您的20%阈值

相关的:


我不建议这样做,因为Lucene中的绝对分数值 没有意义(例如,分数不能直接在各个领域进行比较 搜索)。分数与返回的最高分数的比率为 有意义,但最高分数没有绝对校准 返回,至少目前是这样,所以没有办法从中确定 分数决定了结果集的整体质量 已经讨论过的改善这一点的各种方法(使 通过编码附加信息,分数更直接可比 然后用它来标准化,或者更好, 将分数概括为包含多个分数的对象 信息;例如,顶部匹配的查询词总数 如果您使用的是默认值或将是非常有用的),则返回结果 据我所知,这些想法已经付诸实施。-@Chuck

资料来源:


相关信息:

对于任何在这里遇到困难的人来说,这只是一个更新-Lucene已经提供了一个,并且不再需要为此制作自定义收集器。将其包装(在OP的特定情况下)以完成给定的任务

早期终止端口收集器

如果按照给定的排序对段进行排序,则提前终止每个段的文档集合的收集器

TopDocsCollector

用于返回TopDocs输出的所有收集器的基类。此收集器通过提供一个构造函数(该构造函数接受PriorityQueue以及该优先级队列的受保护成员)和总命中数计数器,从而允许轻松扩展


西蒙的回答是正确的。但请记住,社会是相对的,因此很难为“善”设定一个门槛当然是结果。谢谢西蒙。这真的让我对如何实现它有了更好的理解。@Shashikant-也谢谢你分享你的想法。我会记住这一点。我只是会在设定阈值时更加谨慎,这样我就有很小的机会过滤掉相关的结果。