Как сопоставить ключ superset с подмножеством, используя group_level (sub выбирает в couchdb?) - PullRequest
2 голосов
/ 08 марта 2011

Как выполнить подвыборы в couchdb или как сопоставить ключ расширенного набора с подмножеством, используя group_level

У меня довольно сложный вопрос, который, надеюсь, имеет не слишком сложный ответ для того, кто не просто изучаетmap / lower и couchdb в первый раз.

Я работаю над системой, которая предоставляет клиенту манифест json для настройки себя с контентом, который обновляется ежедневно.При первом запуске клиенты регистрируются с помощью нескольких описательных тегов (скажем, размер экрана, ОС, местоположение), и сервер возвращает идентификатор group_id.Клиент использует этот идентификатор для запроса своего манифеста каждый день.На сервере мы произвольно группируем клиентов, которые совместно используют определенные теги, чтобы сократить количество уникальных манифестов, которые нам нужно хранить / обслуживать.

У нашего менеджера по продажам / администратора есть веб-приложение, в котором он может настроить аудиторию для таргетинга определенного контента на определенные группы.Аудитория может перекрывать несколько групп.Хитрость заключается в том, что когда клиент сообщает, чтобы получить новый манифест, нам нужно выяснить, какая аудитория лучше всего подходит для группы этого клиента.Наиболее подходящей аудиторией будет первая аудитория, чьи теги являются подмножеством тегов представленных групп, например:

audience1: tagA, tagB, tagC, tagD
audience2: tagA, tagC

group1: tagA, tagB, tagC

Эта группа должна соответствовать аудитории2, а не аудитории1.

Если бы мы использовалитеги аудиторий, чтобы найти лучшее групповое соответствие (другими словами, если group.tags были подмножеством аудитории.tags), я мог бы создать очень эффективный индекс, например, так:

[tagA, tagB, tagC], group1._id
[tagA, tagC, tagB], group1._id
[tagB, tagA, tagC], group1._id
[tagB, tagC, tagA], group1._id
[tagC, tagA, tagB], group1._id
[tagC, tagB, tagA], group1._id

и использовать group_level = 2с ключом = [tagA, tagC], чтобы сопоставить аудиторию2 со второй строкой в ​​индексе.Проблема в том, что я не могу понять, как сделать это в другом направлении: сопоставить group.tags с индексом audimance.tags, где теги, которые мы знаем во время запроса (group.tags), являются надмножествомс тегами, с которыми мы пытаемся сопоставить (Audience.tags)

У меня есть четкое представление о простых представлениях m / r, но я продолжаю зацикливаться на этом.Каждое решение, к которому я прихожу, включает в себя выполнение какого-то суб-выбора в моей функции представления, которая не работает в представлениях couchdb ... какие-либо идеи о том, как я могу атаковать такую ​​проблему?

Надеюсь, это описание поможеткакой-то смысл.

1 Ответ

2 голосов
/ 10 марта 2011

Самое простое решение, которое я могу придумать, это:

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

В вашем примере ключи могут быть:

[tagA, tagB, tagC]
[tagB, tagC]
[tagA, tagC]
[tagA, tagB]
[tagC]
[tagB]
[tagA]

Первый результат - это то, что вы хотите, поэтому вы можете использовать limit = 1.

...