Подтвердить что ты не робот

Как я могу нормализовать оценку 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;
    }
}

Итак, я полагаю, мои вопросы:

  • Как наилучший способ нормализации оценка, чтобы я мог понять, как многие "звезды", чтобы дать?

  • Есть ли другой способ забить результаты?

Спасибо

Грант

4b9b3361

Ответ 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