比较属性集以找到最佳匹配


compare sets of properties to find best match

似乎有类似的问题,但不完全是这样。我试着沿着这条路走下去(比较数据集并返回最佳匹配),但发现自己被难住了。

我需要取一个集合并找到最佳匹配集合。假设我们有一个包含值(1,4,29,44,378,379)的search_obj。我想找到其他具有类似值的对象,理想情况下找到最匹配的对象。会有大量的其他对象,所以性能是一个大问题。

我目前在php和mysql工作,但我愿意改变,如果这意味着更好的性能。

谢谢你的帮助。

我突然想到:

假设你有一个唯一对(a, b)的表:

CREATE table t1 (a INT, b INT, PRIMARY KEY (a, b));

现在填入:

INSERT INTO t1
VALUES (1,1), (1,2),               -- item to compare with
       (2,1), (2,3),               -- has one common prop with 1
       (3,1), (3,2),               -- has the same props as 1
       (4,1), (4,2), (4,3), (4,4); -- has 2 same props with 1

下面的查询将根据相似度对其他项排序:

SELECT t1.a,
    COUNT(t2.a) as same_props_count,
    ABS(COUNT(t2.a) - COUNT(*)) as diff_count
FROM t1
LEFT JOIN t1 as t2 ON t1.b = t2.b and t2.a = 1
WHERE t1.a <> 1
GROUP BY t1.a
ORDER BY same_props_count DESC, diff_count;

a, same_props_count, diff_count
3, 2,                0
4, 2,                2
2, 1,                1

您可以使用array_intersect计算两个数组的交集,它返回第一个数组中存在于第二个数组中的值。如果你对多个列表进行比较,那么你可以使用返回数组的长度(即长度越大越接近交集,因此,越接近匹配)。