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