Фильтруйте посты по нескольким тегам, чтобы возвращать посты, имеющие все эти теги, с хорошей производительностью - PullRequest
4 голосов
/ 02 марта 2010

StackOverflow позволяет искать сообщения по тегам и фильтровать по пересечению тегов, например, ruby x mysql x tags. Но обычно неэффективно извлекать такие списки из MySQL, используя множественные объединения тегов. Какой более эффективный способ реализовать запросы тегов с фильтрацией по нескольким тегам?

Есть ли хороший NoSQL-подход к этой проблеме?

1 Ответ

2 голосов
/ 03 марта 2010

В сценарии, ориентированном на NoSQL или на документ, у вас будут фактические теги как часть вашего документа, скорее всего, хранящиеся в виде списка. Поскольку вы пометили этот вопрос как "couchdb", я буду использовать его в качестве примера.

«Опубликовать» документ в CouchDB может выглядеть так:

{
   "_id": <generated>,
   "question": "Question?",
   "answers": [... list of answers ...],
   "tags": ["mysql", "tagging", "joins", "nosql", "couchdb"]
}

Затем, чтобы сгенерировать представление с тегами:

{
   "_id": "_design/tags",
   "language": "javascript",
   "views": {
      "all": {
         "map": "function(doc) {
            emit(doc.tags, null);
         }"
      }
   }
}

В CouchDB вы можете выдать HTTP POST с несколькими ключами, если хотите. Пример в документации . Используя эту технику, вы сможете осуществлять поиск по нескольким тегам.

Примечание. Установка значения NULL, указанного выше, помогает сохранять небольшие размеры. Используйте include_docs=true в своем запросе, если вы хотите видеть и фактические документы.

...