solr/lucene中是否有內置的功能來篩選結果,如果它們低於某個分數閾值?比方說,如果我提供0.2的分數閾值,那麼所有分數小於0.2的文檔將從我的結果中刪除。我的直覺是,這可以通過更新/定製solr或lucene來實現。在Solr/Lucene中刪除低於某個得分閾值的結果?
你能指出我如何做到這一點正確的方向?
在此先感謝!
solr/lucene中是否有內置的功能來篩選結果,如果它們低於某個分數閾值?比方說,如果我提供0.2的分數閾值,那麼所有分數小於0.2的文檔將從我的結果中刪除。我的直覺是,這可以通過更新/定製solr或lucene來實現。在Solr/Lucene中刪除低於某個得分閾值的結果?
你能指出我如何做到這一點正確的方向?
在此先感謝!
你可以寫你自己的珍藏,將忽略收集這些文件,下面的閾值的得分手的地方。下面是使用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;
}
}
謝謝西蒙。這真的讓我更好地理解如何實現它。 @Shashikant - 也感謝您分享您的想法。我會記住這一點。在設置閾值時我會更加謹慎,以便濾除相關結果的可能性很小。 – snickernet 2010-05-21 05:33:02
它被稱爲歸一化分數(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
只是一個任何人誰更新絆倒在這裏 - 一個EarlyTerminatingSortCollector已經被Lucene的提供和定製的收藏家並不需要是爲此做了。將其包裝在TopDocsCollector(在OP的具體情況下,TopScoreDocCollector)以實現給定的任務。
EarlyTerminatingSortCollector
,早期終止在每個區間爲單位的文件集,如果段是根據給定的排序分類收集器。
TopDocsCollector
甲基類返回一個TopDocs輸出所有收集器。這個收集器允許通過提供一個接受PriorityQueue的單一構造函數以及該優先級隊列的受保護成員和一個總點擊次數計數器來輕鬆擴展。
Simon的回答是正確的。但要記住,社會是相對的,因此很難爲結果的「好」選擇一個門檻。 – 2010-05-20 09:54:59