2015-06-17 2 views
1

Я работаю с Hibernate Search уже несколько месяцев, но все же я не могу переварить релевантность, которую он приносит. Я в целом удовлетворен результатами, которые он возвращает, но даже самый простой тест не соответствует моим ожиданиям.Понимание алгоритма скоринга Apache Lucene

Первое испытание использовало термин частота (tf). данных:

  • слово
  • слово слово
  • слово слово слово
  • слово слово слово слово
  • слово слово слово слово слово
  • слово слово слово слово слово слово

Результаты:

  1. слово
  2. слово слово слово слово
  3. слово слово слово слово слово
  4. слово слово слово слово слово слово
  5. слово слово
  6. слово слово слово

Я действительно смущенный этим эффектом. Мой запрос является довольно сложным, но этот тест не имеет какого-либо другого поля, то для нее может быть упрощена, как показано ниже: booleanjunction.should (phraseQuery) .Should (keywordQuery) .Should (fuzzyQuery)

Я анализаторы как показано ниже:

StandardFilterFactory 
LowerCaseFilterFactory 
StopFilterFactory 
SnowballPorterFilterFactory for english 

Моего Объяснение объекта https://jsfiddle.net/o51kh3og/

ответ

4

расчета Scoring это что-то действительно сложное. Здесь, вы должны начать с the primal equation:

счет (д, д) = Корд (д, д) · queryNorm (д) · Σ (тс (т в д) · IDF (т) 2 · t.getBoost() · норма (т, д))

Как вы сказали, вы имеете tf что означает термин частоту и его значение является SquareRoot частоты термина.

Но здесь, как вы можете видеть в your explanation, вы также norm (ака fieldNorm), который используется в fieldWeight расчета.Давайте возьмем ваш пример:

Эклавия Эклавия Эклавия Эклавия Эклавия

4.296241 = fieldWeight in 177, product of: 
    2.236068 = tf(freq=5.0), with freq of: 
    5.0 = termFreq=5.0 
    4.391628 = idf(docFreq=6, maxDocs=208) 
    0.4375 = fieldNorm(doc=177) 

Эклавия

4.391628 = fieldWeight in 170, product of: 
    1.0 = tf(freq=1.0), with freq of: 
    1.0 = termFreq=1.0 
    4.391628 = idf(docFreq=6, maxDocs=208) 
    1.0 = fieldNorm(doc=170) 

Здесь eklavya имеет лучший результат, чем другие, потому что fieldWeight является продукт tf, idf и fieldNorm. Этот последний выше для документа eklavya, потому что он содержит только один термин.

Как и выше документации сказал:

lengthNorm - вычисляется, когда документ добавляется к индексу в соответствии с количеством маркеров этого поля в документе, так , что более короткие поля вносят больший вклад в Гол.

Чем больше терминов у вас есть в поле, тем ниже fieldNorm будет. Будьте осторожны с value of this field.

Итак, здесь у вас идеальное сочетание, чтобы понять, что оценка не рассчитывается только с частотой, а также с количеством термина, которое у вас есть в вашей области.

+1

Отлично! Мне не хватало точки fieldNorm. Я думал, что это какой-то нормализационный фактор и динамически основывается на оценке другого документа. Теперь я понимаю, что он основан на длине поля. Благодаря! – Tejas

Смежные вопросы