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

时间:2010-05-20 06:50:09

标签: lucene solr

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

你能否指出我如何做到正确的方向?

提前致谢!

3 个答案:

答案 0 :(得分:7)

你可以编写自己的收藏家,忽略收集得分者低于你的门槛的那些文件。下面是一个使用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;
    }
}

答案 1 :(得分:5)

它被称为标准化分数(Scores As Percentages)。

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

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

其中20是你的20%门槛。

相关:how do I normalise a solr/lucene score?


  

我不建议这样做,因为Lucene中的绝对分数值   没有意义(例如,分数不能直接比较   搜索)。得分与最高得分的比率为   有意义,但没有最高分的绝对校准   至少目前已经回来了,所以没有办法确定   分数结果集的质量总体如何。有   已经讨论过的各种改进方法(制作   通过编码附加信息,分数更直接可比   进入得分并使用它进行标准化,或者可能更好,   将分数推广到包含多个部分的对象   信息;例如顶部匹配的查询字词总数   结果,如果你使用默认OR或非常有用)。没有   据我所知,这些想法已经实施。 - @Chuck

来源:RE: Limiting Hits with a score threshold

相关:Re: A question about scoring function in Lucene

答案 2 :(得分:0)

对于在这里偶然发现的任何人来说,只是一个更新 - 由Lucene提供EarlyTerminatingSortCollector并且不再需要为此定制收集器。将其换行TopDocsCollector(在OP的特定情况下,TopScoreDocCollector)以完成给定的任务。

EarlyTerminatingSortCollector

  

如果根据给定的排序对片段进行排序,那么该片段会基于每个片段提前终止文档集合。

<强> TopDocsCollector

  

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