2012-12-06 12 views
5

Próbuję lepiej zrozumieć, w jaki sposób lucen zdobył moje wyniki wyszukiwania, dzięki czemu mogę wprowadzić niezbędne poprawki do mojej konfiguracji wyszukiwania lub zawartości dokumentu.solr/lucene idf wynik

Poniżej znajduje się część wyniku punktowego.

produktem:

0.34472802 = queryWeight, product of: 
     2.2 = boost 
     7.880174 = idf(docFreq=48, maxDocs=47667) 
     0.019884655 = queryNorm 
     1.9700435 = fieldWeight in 14363, product of: 
     1.0 = tf(freq=1.0), with freq of: 
      1.0 = termFreq=1.0 
     7.880174 = idf(docFreq=48, maxDocs=47667) 
     0.25 = fieldNorm(doc=14363) 
0.26806915 = (MATCH) max of: 
    0.07832639 = (MATCH) weight(shortDescription:tires^1.1 in 14363) [DefaultSimilarity], result of: 
    0.07832639 = score(doc=14363,freq=1.0 = termFreq=1.0 

rozumiem, w jaki sposób oblicza się jako impuls, który jest moją wartość konfiguracja

Ale jak została obliczona IDF (7.880174 = wartość IDF).

Według Lucene, IDF formuła brzmi: IDF (t) = 1 + log (numDocs/(docFreq + 1))

Sprawdziłem konsolę rdzeń administratora i okazało się, że mój docFreq = maxDocs = 47667

Używając wzoru z lucenu, nie byłem w stanie obliczyć spodziewanego 7,880174. Zamiast tego otrzymuję: idf = 3,988 = 1 + log (47667/(48 + 1)).

Czy jest coś, czego brakuje mi w mojej formule.

Odpowiedz

6

myślę swój log funkcja wybierz 10 jako podstawę, podczas gdy w lucene wybieramy e jako podstawę.

log(47667/(48+1), 10) = 2.9880217397306 
log(47667/(48+1), e) = 6.8801743154459 

Kod źródłowy idf metodą Lucene jest:

public float idf(int docFreq, int numDocs) { 
    return (float)(Math.log(numDocs/(double)(docFreq+1)) + 1.0); 
    } 

Jak widać, idf użycie Java Math.log obliczyć idf while Math.log wybrać e jak log funkcję. Szczegółowe informacje można znaleźć w Java Math api.