是否删除Solr/Lucene中低于某个分数阈值的结果?
如果结果低于某个分数阈值,solr/lucene中是否有内置功能来过滤结果?假设我提供的分数阈值为.2,那么分数小于.2的所有文档都将从我的结果中删除。我的直觉是,通过更新/定制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
提前谢谢 您可以编写自己的收集器,该收集器将忽略收集记分员放在阈值以下的文档。下面是一个使用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-也谢谢你分享你的想法。我会记住这一点。我只是会在设定阈值时更加谨慎,这样我就有很小的机会过滤掉相关的结果。