Как я могу нормализовать оценку solr/lucene?
Я пытаюсь выяснить, как улучшить оценку результатов поиска solr. Моему приложению нужно взять оценку из результатов solr и отобразить несколько "звезд" в зависимости от того, насколько хорошими являются результаты запроса. 5 звезд = почти/точное до 0 звезд, что означает, что поиск не очень хорошо подходит, например. удаляется только один элемент. Однако я получаю оценки от 1.4 до 0.8660254, оба возвращают результаты, которые я бы дал 5 звезд. То, что мне нужно сделать, это как-то превратить эти результаты в процент, чтобы я мог отметить эти результаты с правильным количеством звезд.
Запрос, который я запускаю, дает мне оценку 1.4:
euallowed: true AND (оценка: "2: 1" )
Запрос, который дает мне оценку 0.8660254:
euallowed: true AND (оценка: "2: 1" ИЛИ оценка: "1-й" )
Я уже обновил сходство, так что tf и idf возвращают 1.0, поскольку меня интересует только то, что документ имеет термин, а не номер этого термина в документе. Вот как выглядит мой код сходства:
import org.apache.lucene.search.Similarity;
public class StudentSearchSimilarity extends Similarity {
@Override
public float lengthNorm(String fieldName, int numTerms) {
return (float) (1.0 / Math.sqrt(numTerms));
}
@Override
public float queryNorm(float sumOfSquaredWeights) {
return (float) (1.0 / Math.sqrt(sumOfSquaredWeights));
}
@Override
public float sloppyFreq(int distance) {
return 1.0f / (distance + 1);
}
@Override
public float tf(float freq) {
return (float) 1.0;
}
@Override
public float idf(int docFreq, int numDocs) {
//return (float) (Math.log(numDocs / (double) (docFreq + 1)) + 1.0);
return (float)1.0;
}
@Override
public float coord(int overlap, int maxOverlap) {
return overlap / (float) maxOverlap;
}
}
Итак, я полагаю, мои вопросы:
-
Как наилучший способ нормализации
оценка, чтобы я мог понять, как
многие "звезды", чтобы дать?
-
Есть ли другой способ забить
результаты?
Спасибо
Грант
Ответы
Ответ 1
Чтобы процитировать http://wiki.apache.org/lucene-java/ScoresAsPercentages:
Люди часто хотят вычислить "Процент" из оценок Lucene, чтобы определить, что такое "100% идеальный" матч против "50%". Это также некоторые вещи, называемые "нормализованным счетом"
Не делайте этого.
Серьезно. Перестаньте пытаться думать о своей проблеме таким образом, это не закончится хорошо.
Эта страница дает пример того, как вы могли бы в теории сделать это, но это очень сложно.
Ответ 2
Мне никогда не приходилось делать что-то сложное в Solr, поэтому может быть способ подключить его как плагин, но вы можете обработать его в клиенте, когда возвращается результат. Если вы отсортированы по релевантности, это должно быть просто - получить актуальность первого результата (макс.) И последнего (мин). Затем для каждого результата с релевантностью x вы можете вычислить
normalisedValue = (x - min) / (max - min)
который даст вам значение от 0 до 1. Умножьте на 5 и раунд, чтобы получить количество звезд.
Ответ 3
Он назвал нормализованный балл (Оценка как проценты).
Для этого вы можете использовать следующие параметры:
ns = {!func}product(scale(product(query({!type=edismax v=$q}),1),0,1),100)
fq = {!frange l=20}$ns
Где 20 - ваш 20% -ый порог.
См. также:
Удалить результаты ниже определенного порогового значения в Solr/Lucene?
http://article.gmane.org/gmane.comp.jakarta.lucene.user/12076
http://article.gmane.org/gmane.comp.jakarta.lucene.user/10810