«Автозаполнение» тегов с MapReduce в MongoDb - PullRequest
0 голосов
/ 15 февраля 2012

Короткая версия : мне нужно получить массив различных тегов, соответствующих /web/ или любому другому термину по этому вопросу, из коллекции Posts.


У меня есть сомнения по поводу реализации шаблона MapReduce для подачи в поле «автозаполнение».Считаете ли вы, что это лучший подход?

Моя коллекция Posts содержит документы, такие как:

{
    'title': 'A great post',
    'tags': ['web2.0', 'monetize', 'cloud', 'someOtherDumbTerm']
}
{
    'title': 'Another great post',
    'tags': ['monetize', 'seo-optimization', 'web3.0']
}

При таком поиске, как /web/, у меня были бы такие результаты: ["web2.0", "web3.0"]

Моя функция MapReduce выглядит следующим образом:

var mapFn = function(){
    if( this.tags ){
        this.tags.forEach(function(value){
            if (value.match(/web/i)){
                emit('web', value);
            }
        });
    }
};
var reduceFn = function(key, values){
    return {result:values};
};

db.runCommand({
    mapreduce: 'posts',
    out: {inline:1},
    map: mapFn,
    reduce: reduceFn,
    query: {tags:/web/}
});

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

Спасибо!


Что я закончилдо выполнения

Я фактически только использовал MapReduce для аналитики указанных тегов.

Я храню их описанным способом, но в другой коллекции, стараясь нормализовать его до базового ASCII (т.е.акценты и тому подобное) для поиска по регулярному выражению, а также для сохранения первоначальных терминов.Затем я ссылаюсь на идентификатор объекта tag на идентификатор post в другой коллекции.

Все это я превратил в другое приложение для обслуживания разных клиентов.Это оказалось лучшим решением для моей конкретной потребности.

1 Ответ

0 голосов
/ 15 февраля 2012

Я думаю, что Map / Сокращение тегов в другую коллекцию звучит очень разумно.

Вы не можете выполнить запрос Map / Reduce в режиме реального времени. И вы не можете использовать стандартные запросы поиска, чтобы получить только те теги, которые вы хотите из своей существующей коллекции. И вам, вероятно, все равно, не содержит ли ваша система автозаполнения тегов новые теги за последний час или последний день или как часто выполняется ваше задание MapReduce.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...