Как мне нормализовать балл 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;
}
}
Итак, я полагаю, мои вопросы:
Как лучше всего нормализовать счет, чтобы я мог определить, сколько "звезд" дать?
Есть ли другой способ оценки результатов?
Спасибо
Грант
3 ответа
Процитировать http://wiki.apache.org/lucene-java/ScoresAsPercentages:
Люди часто хотят вычислить "Процент" из баллов Lucene, чтобы определить, что такое "100% идеальный" матч против "50%". Это также то, что называется "нормализованный счет"
Не делай этого.
Шутки в сторону. Прекратите пытаться думать о своей проблеме таким образом, это не закончится хорошо.
На этой странице приведен пример того, как вы могли бы теоретически сделать это, но это очень сложно.
Это называется нормализованным счетом ( Счеты в процентах).
Для этого вы можете использовать следующие параметры:
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
Мне никогда не приходилось делать что-либо настолько сложное в Solr, поэтому может быть способ подключить это как плагин - но вы можете обработать это в клиенте, когда будет возвращен набор результатов. Если вы отсортировали по релевантности, это должно быть очень просто - получите результат первого (максимального) результата и последнего (минимального). Затем для каждого результата с релевантностью х можно рассчитать
normalisedValue = (x - min) / (max - min)
что даст вам значение от 0 до 1. Умножьте на 5 и округлите, чтобы получить количество звезд.