Хранение и извлечение любимых тегов пользователей - PullRequest
1 голос
/ 20 октября 2011

Я пытаюсь внедрить поведенческий анализ для целевого маркетинга на моем сайте электронной коммерции.Основная идея заключается в следующем (я предполагаю использование MongoDB, но с нетерпением жду других рекомендаций):

  • каждый веб-сайт Category имеет список связанных tags с ним,
  • каждый контент Article также имеет список tags,
  • каждый User имеет уникальный идентификатор файла cookie, назначенный ему / ей при первом посещении,
  • каждый раз, когда пользователь просматривает Category или читает Article, мы планируем увеличивать словарь User-tag следующим образом:

    db.tagviews.update(
        {_id: user_id},
        {$inc: {'tags.foo': 1, 'tags.bar': 1, 'tags.baz': 1}},
        true /* upsert */
    )
    

Так что если мы хотимчтобы увидеть интересы конкретного пользователя, мы можем получить для него документ tagviews и просмотреть tags, чтобы увидеть, какие из них имеют наибольшее количество просмотров.

Однако я наткнулся на довольно многоТривиальная вещь - как выбрать пользователей, основываясь на критериях тегов.Например, у нас есть в наличии Google Galaxy Nexus по привлекательной цене, и мы хотим отправлять маркетинговые электронные письма пользователям, наиболее заинтересованным в [android, phones, gadgets, google].

Насколько я понимаю, мы должны создавать индексы для каждого поля tags.* в коллекции tagviews, что, конечно, неприемлемо.Другое возможное решение - дублировать данные в другом измерении (увеличивая комбинацию тег-пользователь вместо тега-пользователя).Но синтаксические тесты выглядят очень бесперспективно с точки зрения дискового пространства и гибкости.

Что бы вы посоветовали эффективно выбирать наиболее заинтересованных пользователей на основе критериев тегов?

Спасибо!

1 Ответ

1 голос
/ 20 октября 2011

Из вашего примера я понимаю, что вы используете имена тегов в качестве ключей (или полей) в коллекции tagviews.

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

 tagviews{
      _id : 'xxxx',
      tags : [
        {
           name : "foo",
           count : 0
        },
        {
           name : "bar",
           count : 0
        },
        {
           name : "baz",
           count : 0
        }   
      ]

и вы можете эффективно индексировать этот документ по имени тега, чтобы использовать его в своих фильтрах

db.tagviews.ensureIndex('tags.name',1)

И вы можете увеличить вид конкретного тега пользователя на

db.tagviews.update({_id : "userid" , "tags.name":'foo'},{$inc:{"tags.$.count":1}})

когда твой пользователь наткнулся на его интересы.

Итак, на ваш настоящий вопрос,

как получать пользователей, основываясь на критериях тегов. Например. у нас есть Google Galaxy Nexus есть в наличии по привлекательной цене и хочу отправить маркетинговые электронные письма пользователям, наиболее заинтересованным в [Android, телефоны, гаджеты, Google].

вы можете отфильтровать его как

 db.tagviews.find({'tags.name':{$in : ['android', 'phones','gadgets','google'] }})

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

или даже вы можете использовать счетчик для фильтрации наиболее точных данных

db.tagviews.find({'tags.name':{$in : ['android', 'phones','gadgets','google'] },'tags.count' : {$gt : 0 }})

надеюсь, это поможет

...