MySQL, каков наилучший подход к ранжированию от наивысшего соответствия? - PullRequest
4 голосов
/ 16 февраля 2012

У меня есть база данных MySQL, которую я ищу.Допустим, это база данных людей.При запросе определенной записи можно найти совпадение на 100% для каждого атрибута.Но запрос к базе данных, чтобы найти наиболее близкое совпадение по вероятности (наиболее близкое совпадение по атрибутам таблицы) - это больше стратегия.

В этом сценарии имеет ли смысл создавать временную таблицу (очень похожую на лист учета), чтобы указать, какие атрибуты соответствуют / какие атрибуты присутствуют?Каков типичный подход к расширенному поиску в базе данных, подобный этому?

Пример (ниже) гипотетической хранимой процедуры Параметры

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

call FindPerson ("Brown Eyes", "Brown hair", "Height:6'1", "white", "Name:Joe" ,"weight180", "Age 34" "sex m");

RESULT TABLE
NAME  AGE HEIGHT WEIGHT HAIR  SKIN  sex  RANK_MATCH
Joe   32  6'1    180    Brown white m    1
Mike  33  6'1    179    Brown white m    2
James 31  6'0    179    Brown black m    3 

Ответы [ 2 ]

2 голосов
/ 16 февраля 2012

Подход, который я бы использовал, состоял бы в том, чтобы создать функцию оценки (ваш сохраненный процесс), которая оценивала бы стандартное расстояние данного ввода от среднего.

В процедуре вы будете оценивать каждый критерий следующим образом:

INPUT AGE: 32
calculate MEAN of AGE WHERE (sex = m): 34.5
calculate STANDARD DEVIATION of AGE WHERE (sex = m): 2.5
calculate how many STDEVs 32 is from the 34.5 (also known as z-score): 1

Повторите этот процесс для всех числовых типов данных, суммируя их и ЗАКАЗЫВАЯ ПО ​​сумме.

При этом потребовалось бы следующее изменение схемы: высота изменилась с фут / дюйм на строго дюймы.

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

Если вы обнаружите, что цвет волос / цвет кожи можно с пользой перевести в, скажем, непрерывный спектр цветов, ваш выигрыш будет таким же ... значение цвета ввода по сравнению со значением цвета средних и стандартных отклонений.

Запрос, который найдет ваши совпадения, будет иметь следующий эффект:

SELECT
 ABS(INPUT_AGE - AVG(AGE)) / STD(AGE) AS age_z,
 ABS(INPUT_WT - AVG(WT)) / STD(WT) AS wt_z,
...
 (age_z + wt_z + ...) AS score
FROM `table`
ORDER BY score ASC
2 голосов
/ 16 февраля 2012

Просто у меня в голове.Вы можете создать свой собственный счет и сортировать по нему.Что-то вроде

SELECT `id`,
  (IF(`age`=32,1,0)+IF(`height`="6'1",1,0)+...) as  `score`
FROM `people`
HAVING `score` > 0
ORDER BY `score` DESC
LIMIT 10;

При этом вы можете обрабатывать каждое поле с помощью собственного сравнения, а также взвешивать отдельные атрибуты, не просто добавляя 1, но 2 или более.Но я не уверен, насколько это эффективно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...