Поиск «многие ко многим» с помощью Sphinx

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

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

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

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

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


person Yau Leung    schedule 01.11.2010    source источник


Ответы (2)


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

Я использовал это в прошлом для поиска «интересов» против «человека». Так что я могу любить рок-музыку и смотреть регби. Sphinx может индексировать это в массиве, и вы можете искать их, используя сопоставление ИЛИ или И.

person Ian    schedule 24.11.2010

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

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_tag_table:

question_id INT
tag_id INT
person Charly    schedule 02.11.2010
comment
Так как это много-много случаев, вы будете создавать много записей для одних и тех же вопросов. Еще одна более серьезная проблема заключается в том, что если вопрос соответствует более чем 1 ключевому слову вашего этапа поиска, рейтинг все равно остается низким. - person Yau Leung; 03.11.2010