как мне нормализовать балл solr / lucene? - PullRequest
15 голосов
/ 21 октября 2010

Я пытаюсь решить, как улучшить оценку результатов поиска solr. Моему приложению необходимо взять оценку из результатов Solr и отобразить количество «звездочек» в зависимости от того, насколько хороши результаты для запроса. 5 звездочек = почти / точно до 0 звездочек, что означает, что поиск не очень хорошо соответствует, например, попадет только один элемент. Однако я получаю оценки от 1,4 до 0,8660254, и оба возвращают результаты, которым я бы дал 5 звезд. Мне нужно как-то превратить эти результаты в проценты, чтобы я мог пометить эти результаты правильным количеством звездочек.

Запрос, который я запускаю, дает мне 1,4 балла:

euallowed: true AND (оценка: "2: 1")

Запрос, который дает мне оценку 0,8660254:

euallowed: true И (оценка «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. Как лучше всего нормализовать счет, чтобы я мог понять, как много «звезд» подарить?

  2. Есть ли другой способ оценки Результаты

Спасибо

Grant

Ответы [ 3 ]

16 голосов
/ 22 октября 2010

Цитировать http://wiki.apache.org/lucene-java/ScoresAsPercentages:

Люди часто хотят вычислить «Процент» из баллов Lucene, чтобы определить, что является «100% идеальным» совпадением против «50%» совпадения.Это также то, что называется «нормализованным счетом»

Не делайте этого.

Серьезно.Прекратите пытаться думать о своей проблеме таким образом, это не закончится хорошо.

На этой странице приведен пример того, как вы могли бы теоретически это сделать, но это очень сложно.

2 голосов
/ 02 апреля 2013

Это называется нормализованным счетом ( Число баллов в процентах ).

Вы можете использовать следующие параметры для достижения этого:

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

0 голосов
/ 21 октября 2010

Мне никогда не приходилось делать что-либо настолько сложное в Solr, так что может быть способ подключить это как плагин - но вы можете обработать это в клиенте, когда возвращается набор результатов.Если вы отсортировали по релевантности, это должно быть очень просто - получите результат первого (максимального) результата и последнего (минимального).Затем для каждого результата с релевантностью x вы можете рассчитать

normalisedValue = (x - min) / (max - min)

, который даст вам значение от 0 до 1. Умножьте на 5 и округлите, чтобы получить количество звезд.

...