2010-05-20 5 views
11

solr/lucene에 특정 점수 임계 값 아래로 떨어지면 결과를 필터링하는 기본 기능이 있습니까? .2의 점수 임계 값을 제공하면 점수가 .2 미만인 모든 문서가 내 결과에서 제거된다고 가정 해 봅시다. 나의 직감은 이것이 solr 또는 lucene을 업데이트/사용자 정의하여 가능하다는 것입니다.Solr/Lucene에서 특정 점수 임계 값 이하의 결과를 제거 하시겠습니까?

어떻게하면 좋을까요? 사전에

감사합니다!

+3

사이먼의 대답은 정확합니다. 그러나 소크라테스는 상대적이며 따라서 결과의 "선량"에 대한 임계 값을 선택하기가 어렵다는 것을 명심하십시오. –

답변

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; 
    } 
} 
+0

감사합니다. Simon. 이것은 실제로 그것을 구현하는 방법에 대한 훨씬 더 나은 이해를주었습니다. @Shashikant - 의견을 공유해 주셔서 감사합니다. 나는 그것을 염두에 두겠다. 임계 값을 설정할 때 좀 더 신중해야하므로 관련 결과를 필터링 할 기회가 거의 없을 것입니다. – snickernet

4

표준화 점수 (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?


나는이 일을 권하고 싶지 않다. 반환 된 가장 높은 점수에 대한 점수의 비율은 의미가 있지만 이지만 가장 높은 점수에 대한 절대적인 교정은 없습니다 가 반환되었습니다. 적어도 현재로서는 결정할 방법이 없습니다. 점수 결과의 품질 전체 집합입니다. 이 문제를 개선하기위한 다양한 접근법이 있습니다 ( ). 추가 정보 을 점수에 더 직접 인코딩하여 비교하고 정규화에 사용하거나 더 잘 표현하면 여러 조각이 포함 된 개체에 점수가 일반화됩니다. 정보 (예 : 기본 OR을 사용하는 경우 상위 결과와 일치하는 전체 검색어 수)는 매우 유용합니다. 이러한 아이디어는 아직까지 알고 있습니다. - @Chuck

출처 : 관련 RE: Limiting Hits with a score threshold

: 누구를위한 Re: A question about scoring function in Lucene

0

그냥 업데이 트 여기에 실수를 한단다 - EarlyTerminatingSortCollector가 루씬에서 제공되었으며 사용자 지정 수집기가 될 필요가 없습니다 더 이상 이것을 위해 만들어졌다. 해당 작업을 수행하려면 TopDocsCollector (OP의 특정 경우, TopScoreDocCollector)을 감싸십시오.

EarlyTerminatingSortCollector

세그먼트가 주어진 정렬에 따라 정렬 된 경우 초, 당 세그먼트 기반의 문서의 컬렉션을 종료 콜렉터.

TopDocsCollector TopDocs 출력을 반환하는 모든 수집가

기본 클래스. 이 콜렉터는 PriorityQueue를받는 단일 생성자와 해당 우선 순위 큐에 대한 보호 된 멤버 및 총 히트 수의 카운터를 제공하여 쉽게 확장 할 수 있습니다.

관련 문제