【问题标题】:MySQL what would the best approach to ranking highest to lowest possible match?MySQL 排名最高到最低匹配的最佳方法是什么?
【发布时间】:2012-03-08 04:32:08
【问题描述】:

我正在搜索一个 MySQL 数据库。可以说这是一个人的数据库。查询特定记录时,可以在每个属性上找到 100% 的匹配项。但是查询数据库以找到概率上的最接近匹配(表属性上的最接近匹配)更多的是策略。

在这种情况下,创建一个临时表(很像一个计数表)来指示哪些属性匹配/存在哪些属性是否有意义?像这样对数据库进行高级搜索的典型方法是什么?

假设存储过程的示例(如下)

*parameters 只是为了举例说明我将如何搜索。我关心如何执行我的选择。问题是关于方法、策略、技术的 *

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 

【问题讨论】:

  • 我很想看看人们的反应。我以前也有过这个问题。
  • 最接近的匹配是什么意思?您是否想要两个查找具有与给定字符串相似的属性的记录?
  • 你说的是“预定义的标签匹配”还是“文本匹配”?
  • 当然,我将在年龄上使用“BETWEEN VALUES”,在名称上使用“LIKE”,在性等属性上使用 WHERE,还有一堆疯狂的联合和连接。但是我应该如何计算才能找到壁橱比赛的概率?
  • 基本上,这就像一个猜谜游戏,你想知道计算给定查询实际上是指给定人或一组人的概率的最佳方法。

标签: mysql sql database search


【解决方案1】:

我想都没想。您可以创建自己的分数并按其排序。类似的东西

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 或更多来加权各个属性。 但我很安静,不确定它的性能如何。

【讨论】:

    【解决方案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
    

    对所有数值数据类型重复此过程,将它们相加并按总和排序。

    在这样做时,需要进行以下架构更改:高度从英尺/英寸形式更改为严格的英寸。

    根据您的需要,您还可以考虑为性别和肤色/头发颜色制定任意比例。当然,您可能认为不应考虑此类措施,因为它会极大地改变评分功能。如果您选择这样做,则必须找到一些将添加到上述 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
    

    【讨论】:

    • 附带说明,所有数值变量都可以在查询中严格处理,而不是在存储过程中处理;尽管对于“命名”变量(例如头发和眼睛的颜色)来说,存储过程可能是必需的,因为它们可能需要一些比您想要输入查询更复杂的逻辑。
    • PPS,我提供的评分函数对age_z、wt_z、height_z进行了简单的求和,但是你可以选择其他的方法来解释这个距离,比如AVG(x, y, z)或者SUM(1.5 *x, y, z) 给每个因素额外的权重。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多