Добрый вечер!
Пытаюсь найти, более подходящий способ поиска похожих анкет.
У каждого пользователя есть своя анкета,
В таблице есть только 4 тестового поля
это ФИО и коротко о себе,
и остальные поля int от 0 до 3, до 2 и либо 0 либо 1,
поля enum('N','Y')
и ретинг анкеты(не показывается и рассчитывается внутри сайта) от -1000 до 1000,
То есть:
Table:
name | lastname | about | location | col1 | col2 | col3 | col4 и.т.д.
------------------------------------------------------------------------
вася | пупкин | text | loc_id | 0 | 1 | 3 | 0 и.т.д.
так же могу вытащить некоторое кол-во анкет которые нравятся пользователю.
Первыми мыслями было, брать самую популярную анкету по location и на ее основе производить выборку. Потом мне показалось это не очень хорошей идеей, я начал изучать Sphinx и понял что с ним нужно попрактиковаться как минимум несколько дней что бы нормально им пользоватьсья, да и по началу сил Mysql должно хватить.
Сейчас когда писал вопрос пришла мысль, что возможно в Mysql есть возможность усреднить результаты поиска исключив из результата менее похожие и оставляя похожие (друг на друга)? Или может я не туда копаю?
Помогите советом?
И стоит ли оказываться от Sphinx?
RU: Спасибо за совет, год рождения уже есть, думал что бы хранить гороскоп в таблице, сейчас узнаю его при передачи данных view, в любом случае спасибо, буду пересматривать структуру таблиц
RU: Сейчас выдачи похожих анкет нету, Ну я имел ввиду что его ищу, все эти int в таблице уже как бы могут многое сказать, например 0 = живет один, 1= в своей кв и.т.д . Тоже думал реализовать интересы, но отложил так как cтруктура базы реляционная больших проблем не составит
Данная проблема называется "k-nearest neighbors", и существует очень много способов ее решения.
В целом они все сводятся к этому:
Сначала нужно определить функцию расстояния для элементов из таблицы (т.е. юзеров). Это может быть как Эвклидово расстояние, так и любое другое (например, cosine или jaccard для слов из описания)
Затем для каждого из юзеров находим N самых близких на основе этой функции
Сравнивать всех пользователей со всеми - задача затратная, поэтому часто используются индексы для ускорения этого процесса. На уровне БД это может быть R-tree или quad-tree, а на уровне приложения - Locality Sensitive Hashing.