2014-12-23 5 views
0

주어진 쿼리 "20"을 사용하여 달성하는 방법, "something 20"이라는 내용의 문서는 MAX_SCORE과 같은 내용을 갖습니다. "20/12 무언가"는 규칙적인 것이 었습니까?Lucene 점수 조정

나는 유사성 알고리즘을 사용하여 검색을 단순화하지만이 동작은 지금 고통 스럽다. "더 짧은 문서는 더 큰 점수를 얻습니다."행동을 원한다면 lengthNorm factor를 "1"로 설정해야합니다. (이 "20"이 분명히 이기지 만, 그것이 완전히 들어 맞지 않기 때문에가 아니라, 짧기 때문에 ...).

내 사용자 정의 유사성 클래스는 여전히 사용자 정의 유사성이 할 수있는 순간

public class SimpleSimilarity extends DefaultSimilarity { 
    public SimpleSimilarity(){} 


    @Override 
    public float idf(long docFreq, long numDocs) { return 1f; } 



    @Override 
    public float tf(float freq) { return 1f; } 


    @Override 
    public float lengthNorm(FieldInvertState state) { 
     return 1f; 
    } 
} 
+0

[this] (http://stackoverflow.com/questions/12626240/) 중복 어떻게 시행 할 것인가? 정확히 일치하는 것부터 가장 우선 순위가 높은 것까지)? – mindas

+0

조금 다릅니다. 나는 문서의 질문 내용을 편집했다. 만약 토큰 화되지 않는다면, "20"과 "20/12"는 응답을 위해 "20" –

답변

0

에서처럼 보인다. 점수가 높을수록 더 작은 문서가 필요하지 않지만 점수에 일치하는 토큰/문서의 총 용어 비율이 필요합니다.

하는 사용자 정의 유사성이 lengthNorm을 시도

@Override 
public float lengthNorm (FieldInvertState state) 
{ 
    return (float) 1.0/state.getLength(); 
} 

state.getLength()는 문서에있는 토큰의 수를 반환합니다 (/ IDF 등 TF는 위에서 언급 한 바와 같이 1 층 돌아 유지).

일치하는 각 용어에 대해 유사도 점수 방정식 (http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/search/similarities/TFIDFSimilarity.html) 길이 Norm()이 추가됩니다 (일치하는 토큰/문서의 총 검색어 수) 비율이됩니다. 점수 ~ 1.0 2) 뭔가 (20) (문서가이있다 - 당신이 예에서 이제

쿼리가 "20"인 경우

여기 1) (20) (문서) 쿼리와 일치하는 하나 개의 용어가 반환 된 문서의 순서입니다 조건과 일치) - 점수 ~ 0.5 3) 무언가 20/12 (문서에 3 용어와 하나의 일치) - 점수 0.33

+0

에 대한 감사를하지만 아마도 더 짧은 문서로 편향되어있을 것입니다. 쿼리 "20"을 사용하여 "무언가 20"과 "무언가 20"에 대해 동일한 (MAX) 점수를 갖고 싶습니다. –

+0

물론, 귀하의 코퍼스에서 크기가 거의 비슷한 개별 문서의 크기가있을 때 완벽하게 작동합니다. 인덱스 시간에 뭔가를 할 수 있습니까? "20/12"를 하나의 단일 용어로 유지하기 위해 사용자 정의 토크 나이저/분석기를 추가하는 것과 같습니다 (현재 표준 분석은 이것을 두 개의 용어로 분리합니다). 문서에 고유 한 패턴이 있습니까 (예 : XX/YY 유형에 관심이 있으십니까?). 그렇다면이 패턴에 따라 분석기를 설계 할 수 있습니다. – Rushik