Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP/MySQL-查找具有相似或匹配属性的项_Php_Mysql_Compare - Fatal编程技术网

PHP/MySQL-查找具有相似或匹配属性的项

PHP/MySQL-查找具有相似或匹配属性的项,php,mysql,compare,Php,Mysql,Compare,我正在尝试开发一种方法,获取一个具有多个属性的实体,并在数据库中搜索类似的实体(以正确的顺序匹配尽可能多的属性)。这个想法是,它将返回其相似程度的1% 还应考虑属性的顺序,因此开始时的属性比结束时的属性更重要 例如: 项目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 将是低匹配,因为只有一个属性是相同的,并且它位

我正在尝试开发一种方法,获取一个具有多个属性的实体,并在数据库中搜索类似的实体(以正确的顺序匹配尽可能多的属性)。这个想法是,它将返回其相似程度的1%

还应考虑属性的顺序,因此开始时的属性比结束时的属性更重要

例如:

项目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中快速高效地实现这一点,有什么想法吗

我在考虑,但据我所知,我也会考虑两个完全不同的单词在拼写方面的距离。对于这个场景来说似乎并不理想,除非我只是以错误的方式使用它

这可能是因为它可以单独在MySQL中完成,也许可以使用全文搜索或其他方式


这似乎是一个很好的解决方案,但不是为这种情况而设计的。也许二进制比较可以以某种方式使用?

我要做的是将顺序和属性值编码为一个数字。数字具有快速比较的优势

这是一个总体想法,可能还需要一些工作,但我希望它能在某种程度上有所帮助

为每个属性计算一个数字(某种形式的散列),并将代表项目属性出现顺序的数字相乘

假设项目1有3个属性A、B和C

散列(A)=123,散列(B)=345,散列(C)=456

然后乘以出现的顺序,假设我们有已知数量的属性:

(散列(A)*1000,00)+(散列(B)*1000)+(散列(C)*1)=someval

乘数的大小可以调整以反映您的数据集。您必须标识哈希函数。也许是soundex

由于散列冲突,问题现在简化为唯一性问题,但我们可以非常确定不匹配的属性

此外,通过使用乘法器的大小从生成的数字中提取散列值,这还具有相对容易检查属性是否以不同顺序出现在另一项中的优点

编辑:检查匹配项的示例

给定项目1(a b c)和项目2(a b c)。项目的计算哈希将相等。这是最好的情况。无需进一步计算

给定项目1(a b c)和项目2(d e a)。项目的计算哈希不相等。继续分解属性哈希

假设属性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))的所有属性组合。然后计算分数


另一种看待它的方式是逐个比较属性,除了这一次,你玩的是数字而不是实际的字符串值,你可以从各种算法中获得灵感(或简单的算法),比如。事实上,您所寻找的似乎是序列比对的描述。但是,我不确定是否可以将此作为SQL查询。

您忘记告诉我们A/B/C/D/E是否是同一个表中的字段,在不同的表中,都是一个大varchar/text/什么的。请更新一些表格定义。目前它完全处于理论阶段,因此可以接受建议(这将由效率决定)。实际属性将是字符串,但它们可能可以使用数字ID进行比较。它们可以存储在单独的表中,并作为联接进行处理,但这会非常低效,因此我想知道它们是否也可以作为字符串缓存在同一个表中,并且在比较时只将字符串作为一个整体进行查看。另一个想法是,它可以为每个项目创建某种类型的指纹,并在此基础上搜索(如果这样做更快的话)您想要的确切o/p是多少?只有完美的结果?不,只有一个部分或完全匹配的所有结果的列表,按其%match排序所有属性值都已知吗?所有实体都有相同数量的属性吗?非常有趣的概念,我非常喜欢比较数字的想法。我刚刚将其作为电子表格进行了尝试,我认为其缺陷在于散列。在本例中,散列只是属性-1、2、3等的增量ID。产生的问题是乘法器,如果ID是一个高数字,则计算的数字会变得非常高。检查并查看实体1、2和3之间的差异-与没有类似值的实体4相比,实体3的最终值非常高。预计数字会相对较高。对于8 tho的样本集,乘数可以是10次幂的增量。因此,最高哈希结果将低于1000。我考虑的是任意精度(bigint)数字,而不仅仅是32或64位整数。对不起,我不知道它是如何工作的。。在实体4乘以4 x 10的例子中,总是大于1 x 10(实体1),而实体3应该更近,但实际上是8 x 10(使其比实体4离实体1更远)。看看这张图片中的“与实体1的区别”和“顺序”,根据实体的属性,顺序是完全错误的-不需要道歉。那将是我的fa