我正在尝试开发一种获取具有多个属性的实体并在数据库中搜索类似实体的方法(尽可能以正确的顺序匹配尽可能多的属性).这个想法是它会返回它有多相似的百分比.
还应考虑属性的顺序,因此开头的属性比最后的属性更重要.
例如:
项目1 - A,B,C,D,E
第2项 - A,B,C,D,E
将100%匹配
项目1 - A,B,C,D,E
项目2 - B,C,A,D,E
这不是一个完美的匹配,因为属性的顺序不同
项目1 - A,B,C,D,E
项目2 - F,G,H,I,A
将是一个低匹配,因为只有一个属性是相同的,它位于第5位
该算法将运行成千上万的记录,因此需要具有高性能和高效率.有关如何以快速有效的方式在PHP/MySQL中执行此操作的任何想法?
我正在考虑levenshtein但据我所知,这也将考虑拼写方面两个完全不同的单词之间的距离.除非我只是以错误的方式使用它,否则似乎不适合这种情况.
它可能只能在MySQL中完成,可能使用全文搜索或其他东西.
这似乎是一个很好的解决方案,虽然不是为这种情况设计的.也许二进制比较可以用某种方式?
我要做的是将订单和属性值编码为数字。数字的优点是比较速度快。
这是一个总体想法,可能仍需要一些工作,但我希望它能以某种方式有所帮助。
为每个属性计算一个数字(某种形式的散列),并将代表项目属性出现顺序的数字相乘。
假设 item1 有 3 个属性 A、B 和 C。
哈希(A)= 123,哈希(B)= 345,哈希(C)= 456
然后将其乘以出现的顺序(假设我们有已知数量的属性):
(哈希(A) * 1,000,00) + (哈希(B) * 1,000) + (哈希(C) * 1) = someval
可以调整乘数的大小以反映您的数据集。您必须识别哈希函数。也许是声音?
现在,由于哈希冲突,问题已简化为唯一性问题,但我们可以非常确定不匹配的属性。
此外,通过使用乘数的大小从生成的数字中提取哈希值,这将具有相对容易检查属性是否以不同顺序出现在另一个项目中的优点。
HTH。
编辑:检查匹配的示例
给定 item1(abc) 和 item2(abc)。计算出的项目散列将是相等的。这是最好的情况。不需要进一步的计算。
给定 item1(abc) 和 item2(dea)。计算出的项目散列不相等。继续分解属性哈希......
假设属性 a = 1、b = 2、c = 3、d = 4、e = 5 的哈希表,乘数为 10^n。item1 的计算哈希为 123,item2 为 451,分解每个属性的计算哈希,并比较每个 item1(变为 item1(1 2 3) )和 item2(变为 item2(4 5 1) 的属性的所有组合))。然后计算分数。
另一种看待它的方法是逐一比较属性,只不过这一次,您使用的是数字而不是实际的字符串值