2016-10-25 2 views
2

나는 "red fox" 왜 lucene 부스트 쿼리가 동일한 일반 쿼리보다 점수가 낮습니까?

  • 쿼리 1 = =

    1. 쿼리 1 이상한 행동을 루씬에 부스트 연산자를 테스트하고 발견 해요 "red^1.2 fox" 나는 텍스트에 대한 쿼리를 테스트

    :

    "멋진 붉은 여우"

    내가 query2보다 낮은 점수를 얻었습니다. 그러나 나는 query2가 이길 것으로 기대합니다.

    내가 쿼리가 정상보다 낮은 점수가 밀어 이유를 궁금해 쿼리 1

    {0,4313012 = (MATCH) sum of: 
        0,2396118 = (MATCH) weight(content:fox^1.25 in 0), product of: 
        0,7808688 = queryWeight(content:fox^1.25), product of: 
         1,25 = boost 
         0,3068528 = idf(docFreq=1, maxDocs=1) 
         2,035813 = queryNorm 
        0,3068528 = (MATCH) fieldWeight(content:fox in 0), product of: 
         1 = tf(termFreq(content:fox)=1) 
         0,3068528 = idf(docFreq=1, maxDocs=1) 
         1 = fieldNorm(field=content, doc=0) 
        0,1916894 = (MATCH) weight(content:red in 0), product of: 
        0,6246951 = queryWeight(content:red), product of: 
         0,3068528 = idf(docFreq=1, maxDocs=1) 
         2,035813 = queryNorm 
        0,3068528 = (MATCH) fieldWeight(content:red in 0), product of: 
         1 = tf(termFreq(content:red)=1) 
         0,3068528 = idf(docFreq=1, maxDocs=1) 
         1 = fieldNorm(field=content, doc=0) 
    } 
    

    에 대한 설명 쿼리 1

    {0,4339554 = (MATCH) sum of: 
        0,2169777 = (MATCH) weight(content:fox in 0), product of: 
        0,7071068 = queryWeight(content:fox), product of: 
         0,3068528 = idf(docFreq=1, maxDocs=1) 
         2,304384 = queryNorm 
        0,3068528 = (MATCH) fieldWeight(content:fox in 0), product of: 
         1 = tf(termFreq(content:fox)=1) 
         0,3068528 = idf(docFreq=1, maxDocs=1) 
         1 = fieldNorm(field=content, doc=0) 
        0,2169777 = (MATCH) weight(content:red in 0), product of: 
        0,7071068 = queryWeight(content:red), product of: 
         0,3068528 = idf(docFreq=1, maxDocs=1) 
         2,304384 = queryNorm 
        0,3068528 = (MATCH) fieldWeight(content:red in 0), product of: 
         1 = tf(termFreq(content:red)=1) 
         0,3068528 = idf(docFreq=1, maxDocs=1) 
         1 = fieldNorm(field=content, doc=0) 
    } 
    

    에 대한 질의

    에 대한 설명은 아래

    설명?

  • 답변

    1

    이것은 쿼리 규범 때문입니다. 스코어링 알고리즘의이 특징은 스코어를 대략 한 쿼리에서 다음 쿼리로 비교하려고 시도합니다.

    queryNorm = 1/sumOfSquaredWeights ½

    경우 :

    sumOfSquaredWeights = 질의 향상 2 · Σ (IDF · 용어

    은 다음과 같이 계산된다 부스트)

    당신이 설명에서, 단순히 쿼리 규범에 의해 최종 점수를 나누어 그 요인을 제거하면 더 높은 점수를 얻을, 참으로, 두 번째 쿼리가하는 것을 발견 :

    • 쿼리 1을 - > 0.4339554/2.304384 = 0.1883

    • 쿼리 1 -> 0.4313012/2.035813 = 0.2119

    큰 점 : 하나의 검색어에서 다른 검색어로 점수를 비교하는 데 지나치게주의하지 않아야합니다. 점수는 실제로 생성 된 쿼리와 관련이 있습니다.설명에서 부스트 된 용어가 점수에 대한 상대적 인의 무게를 제공한다는 것을 알 수 있습니다. 이것은 모든 향상이 실제로 의도 된 것입니다.

    +0

    그래서 어떻게하면 원하는 동작을 얻을 수 있습니까? 'query2'가 승자가되어야합니다 ('query2' 점수는'query1'보다 높아야합니다). 저는'DefaultSimilarity.QueryNorm' 메소드를 오버라이드하여 쿼리 규범을 무시하기 위해 항상'1.0'을 리턴했습니다. 그게 무슨 뜻입니까? – user854301

    +1

    @ user854301 - 물론, queryNorm을 효과적으로 비활성화 할 것입니다.하지만 비교를 통해 달성하고자하는 것은 거의 확실한 나쁜 아이디어입니다. 쿼리의 컨텍스트에서 추출한 점수는 의미가 없습니다. 나는 당신이하려고하는 것이 무엇이든지 다시 생각해 보길 강력히 권합니다. 참조 : [백분율로 표시] (https://wiki.apache.org/lucene-java/ScoresAsPercentages). – femtoRgon

    관련 문제