일부 주요내용

TF : 문서에서 해당 Term이 나온 횟수입니다. 루씬에서는 sqrt(횟수)로 구현됩니다.

하나의 문서에서 해당 용어의 출현빈도가 많을 수록 가중치가 높다.

IDF : 해당 Term이 전체 Document의 Set에 얼마나 나왔는지를 측정합니다. 다수의 문서에서 나온 경우 이 Term은 Document Set에서 중요하지 않은 Term으로 구분 될 수 있습니다. 즉, 일반적으로 많이 사용되는 단어라는 뜻입니다. 루씬에서는 log(numDocs / (docFreq +  1)) + 1로 구현됩니다.

한 단어가 전체문서 중 출현빈도를 측정한다. 출현빈도가 높으면 가중치가 낮다.


Coord : 검색된 문서에서 쿼리의 Term이 몇 개 들어있는지에 대한 값 입니다. 루씬에서는 overlap / maxOverlap 으로 구현됩니다. 예를 들어서 "나이키 운동화" 라는쿼리를 "나이키 정말 좋아요" 라는 Document에 검색을 할 경우 Coord의 값은 1/2 가 됩니다.


lengthNorm : Term의 중요도 측정을 위한 수치입니다. 즉, 해당 필드에 들어있는 Term의 갯수가 적을 때의 Term의 매치는 더 좋은 점수를 갖게 됩니다. 예를 들어서 "나이키"라는 검색어에 대해서 "나이키 운동화 정말 좋은데 어디서 사요" 라는 문서와 "나이키 운동화"라는 문서에 대해서 검색 될 경우 후자의 문서가 더 높은 점수를 갖게 됩니다. 루씬에서는  1/sqrt(numTerms) * f.getBoost * d.getBoost로 구현됩니다. (numTerms는 필드의 Term 개수) 

f.getBoost : 필드의 가중치 Indexing time에 결정됩니다.

d.getBoost : Document의 가중치 IndexingTime에 결정됩니다. 

queryNorm : 이 수치는 위 공식을 보시면 아시겠지만 문서간의 score(q, d)를 구하는데 직접적인 영향이 없습니다. 하나의 쿼리에 대해서 queryNorm은 동일한 값을 갖기 때문입니다. 이 수치는 쿼리간의 비교를 위한 정규화 값입니다. 

예를 들어 "나이키 운동화" 와 "나이키 신발"의 score(q, d)를 구할 때의 비교값으로 사용 될 수 있습니다. 

boost(t in q) : 쿼리에 있는 Term의 가중치 Search Time에 설정됩니다. 쿼리 문법으로는 ^N 으로 표시합니다. 2개 이상의 Term이 있을때 의미가 있습니다.


이하 상세내용

The authoritative document for scoring is found on the Lucene site here. Read that first.

Lucene implements a variant of the TfIdf scoring model. That is documented here.

The factors involved in Lucene's scoring algorithm are as follows:

  1. tf = term frequency in document = measure of how often a term appears in the document
  2. idf = inverse document frequency = measure of how often the term appears across the index
  3. coord = number of terms in the query that were found in the document
  4. lengthNorm = measure of the importance of a term according to the total number of terms in the field
  5. queryNorm = normalization factor so that queries can be compared
  6. boost (index) = boost of the field at index-time
  7. boost (query) = boost of the field at query-time

The implementation, implication and rationales of factors 1,2, 3 and 4 in DefaultSimilarity.java, which is what you get if you don't explicitly specify a similarity, are: 

note: the implication of these factors should be read as, "Everything else being equal, ... [implication]"

1. tf 
Implementation: sqrt(freq) 
Implication: the more frequent a term occurs in a document, the greater its score
Rationale: documents which contains more of a term are generally more relevant

2. idf
Implementation: log(numDocs/(docFreq+1)) + 1
Implication: the greater the occurrence of a term in different documents, the lower its score 
Rationale: common terms are less important than uncommon ones

3. coord
Implementation: overlap / maxOverlap
Implication: of the terms in the query, a document that contains more terms will have a higher score
Rationale: self-explanatory

4. lengthNorm
Implementation: 1/sqrt(numTerms)
Implication: a term matched in fields with less terms have a higher score
Rationale: a term in a field with less terms is more important than one with more

queryNorm is not related to the relevance of the document, but rather tries to make scores between different queries comparable. It is implemented as1/sqrt(sumOfSquaredWeights)

So, in summary (quoting Mark Harwood from the mailing list),

* Documents containing *all* the search terms are good
* Matches on rare words are better than for common words
* Long documents are not as good as short ones
* Documents which mention the search terms many times are good

The mathematical definition of the scoring can be found athttp://lucene.apache.org/core/4_0_0/core/org/apache/lucene/search/similarities/Similarity.html

Hint: look at NutchSimilarity in Nutch to see an example of how web pages can be scored for relevance



참고) http://www.lucenetutorial.com/advanced-topics/scoring.html