Сортировка записей по алгоритму Reddit с использованием mongodb

Я пытаюсь реализовать алгоритм Reddit в качестве опции сортировки в своем приложении, но я постоянно натыкаюсь на стены повсюду.

Я начал свою реализацию с этого (Сортировка mongodb по алгоритму ранжирования Reddit) в качестве ориентира.

Я попытался преобразовать его в С#; ниже моя попытка преобразования.

var map = new BsonJavaScript(
    @"function() {

        function hot(score, date){
            var order = log10(Math.max(Math.abs(score), 1));
            var sign = score>0 ? 1 : score<0 ? -1 : 0;
            var seconds = epochSeconds(date) - 1134028003;
            var product = order + sign * seconds / 45000;
            return Math.round(product*10000000)/10000000;
        }

        function log10(val){
            return Math.log(val) / Math.LN10;
        }

        function epochSeconds(d){
            return (d.getTime() - new Date(1970,1,1).getTime())/1000;
        }

        emit( hot(this.VoteCount, this.CreatedAt), this );

    }"
);

var reduce = new BsonJavaScript(
    @"function(){}"
);

var finalize = new BsonJavaScript(
    @"{ 'out': { 'inline': 1 } }"
);

return db.Posts.MapReduce(new MapReduceArgs { MapFunction = map, ReduceFunction = reduce, FinalizeFunction = finalize }).GetResults();

Он - результаты, которые я получаю от реализации;

введите здесь описание изображения

Он фактический набор данных. введите здесь описание изображения

По какой-то причине функция возвращает 2 объекта вместо 4. Кроме того, что мне нужно изменить, чтобы функция возвращала весь объект сообщения вместе с вычисленной оценкой?

Был бы очень признателен, если бы кто-нибудь помог мне :)

Заранее спасибо, Жан


person jeanfrg    schedule 18.05.2015    source источник
comment
Прежде всего: уменьшение карты... правда? Просто не надо.   -  person Sammaye    schedule 18.05.2015
comment
Любые предложения о том, как бы вы это реализовали?   -  person jeanfrg    schedule 18.05.2015
comment
Вероятно, полностью на C#   -  person Sammaye    schedule 18.05.2015
comment
Я рассмотрю это и буду держать вас в курсе некоторых тестов, когда я заставлю это работать. :)   -  person jeanfrg    schedule 18.05.2015
comment
Ключевым моментом является не обязательно сценарий лабораторного теста, а то, как внутренний JS-движок вызывается в MongoDB. Особенно, когда вы начинаете получать трафик (подключения) на эту страницу. Движок JS просто не предназначен для этого и не должен быть   -  person Sammaye    schedule 18.05.2015


Ответы (1)


Исправил, внеся 2 модификации.

Эти 2 ресурса чрезвычайно полезны; http://docs.mongodb.org/manual/reference/command/mapReduce/#mapreduce-map-cmd http://docs.mongodb.org/manual/reference/method/db.collection.mapReduce/#db.collection.mapReduce

Во-первых, я изменил параметры, которые я передаю для излучения. Я на лету присваиваю значение «оценки» объекту сообщения и запускаю на нем горячую функцию. Затем я передаю параметр ключа для emit в качестве ключа объекта и параметр значения в качестве нового объекта сообщения со значением оценки. ** излучать (ключ, значение)

this.score = hot(this.VoteCount, this.CreatedAt);
emit( this._id, this );

Затем я изменил способ получения результатов;

db.Posts.MapReduce(new MapReduceArgs { MapFunction = map, ReduceFunction = reduce}).InlineResults

Надеюсь, это поможет кому-то еще :)

Я опубликую тесты с использованием этого метода расчета оценки для расчета оценки на C#, когда у меня будет свободное время.


Альтернативная реализация/обновление: я переключился на более простой/быстрый алгоритм затухания, используемый Hacker News, так как он по-прежнему соответствует моим требованиям. http://amix.dk/blog/post/19574

Score = (P-1) / (T+2)^G

where,
P = points of an item (and -1 is to negate submitters vote)
T = time since submission (in hours)
G = Gravity, defaults to 1.8 in news.arc
person jeanfrg    schedule 18.05.2015