Многие ко многим ищут с помощью Сфинкса - PullRequest
4 голосов
/ 01 ноября 2010

Я хотел бы использовать Sphinx для сопоставления многих со многими. Я взял вопрос и теги здесь в StackOverflow для иллюстрации.

Вопрос может быть связан со многими тегами и наоборот для тега.

Итак, в mysql у меня есть 3 таблицы: question, tag, question_tag.

Я бы хотел найти вопросы, которые содержат как можно больше тегов в наборе "java", "sphinx", "mysql", "hibernate". Таким образом, в результате могут возникнуть вопросы с 3 совпадениями, 2 совпадениями или 1 совпадением.

В настоящее время я создаю поле, которое объединяет все эти теги с пробелом и выполняет поиск сфинкса в этом поле. Но это звучит глупо и создает много накладных расходов при добавлении и удалении тегов. Там будет какой-то умнее, верно?

Ответы [ 2 ]

4 голосов
/ 24 ноября 2010

Взгляните на MVA - Многозначные атрибуты, в документации MVA и sql_attr_multi .

Я использовал это в прошлом, чтобы искать "интересы" против "человека". Поэтому я могу любить рок-музыку и смотреть регби. Sphinx может индексировать это в массиве, и вы можете искать их, используя OR или AND.

0 голосов
/ 02 ноября 2010

Проще всего просто объединить таблицы и сгруппировать по идентификатору вопроса.Сфинкс сделает все остальное за вас:

source src_questions{
  select question_id, question_subject, question_body, tag_value from question \
  JOIN question_tag on question.question_id = question_tag.question_id \
  JOIN tag on question_tag.tag_id = tag.tag_id
  GROUP BY question_id 
}

, что предполагает наличие в ваших таблицах следующих столбцов

таблицы вопросов:

question_id INT
question_subject VARCHAR or TEXT
question_body VARCHAR or TEXT

таблица тегов:

tag_id INT
tag_value VARCHAR or TEXT

вопрос_тэг_таблицы:

question_id INT
tag_id INT
...