我有一个我正在搜索的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
答案 0 :(得分:2)
我的想法。您可以创建自己的分数并按其排序。像
这样的东西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
或更多来加权各个属性。
但我很安静,不确定,这是多么高效。
答案 1 :(得分:2)
我将使用的方法是创建一个评分函数(存储过程),评估给定输入与均值的标准距离。
在过程中,您将以类似于以下的方式判断每个标准:
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
对所有数值数据类型重复此过程,将它们相加并将ORDER BY相加。
这样做时,需要进行以下架构更改:高度从英尺/英寸形式更改为严格英寸。
根据您的需要,您可能还会考虑为性别和肤色/头发颜色设置任意比例。当然,您可能认为不应该考虑这些措施,因为它会大大改变评分函数。如果你选择的话,你必须找到一些可以添加到上面的SUM中的数字...但这很难,因为主格变量不能轻易转化为这些类型的东西。
如果您发现头发颜色/肤色能够有效地转换为连续色谱,那么您的得分数据将是相同的...输入的颜色值与均值和标准偏差的颜色值。
找到匹配项的查询将起到以下作用:
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