0

我有一个在线商店应用程序和一个包含大约 1000 个项目的数据库。

ITEM{
  categories / up to 5  out of 60
  types / up to 2 out of 10
  styles / up to 2 out of 10
  rating / 0-5
}

现在我不会创建具有预定义条件的逐项比较:
- 至少一种常见类别+= 25 分
- 至少一种常见类型+= 25p。
- 如果第一项没有样式+= 0p。- 如果没有共同
的风格-= 10p。- 对于评分差异的每个点 -= 5p。

并将结果存储在表格中。作为item_to_item_similarity.score.

现在我用一个漂亮而闪亮的 PHP 函数和类做了整个事情。
还有一个计算和更新所有关系的函数。

在有 20 个项目的测试中.. 一切顺利。但是当将测试数据增加到 1000 项时 .. 导致 1000x1000 关系服务器开始抱怨 script_time_out .. 并且内存不足:)

索引、事务和预加载一些数据.. 帮助了我一半。

有没有更聪明的方法来比较和评估这类数据?

我正在考虑将相关的类别、样式等表示
为一组 ID,可能在一些二进制掩码中......这样它们就可以很容易地进行比较(即使在 SQL 中?)而无需创建类和循环槽数百万次的数组。

4

1 回答 1

1

我知道这不是最好的,但是,以下情况如何:

  1. 你有你的表,它链接了这两个项目,一个时间戳,并有他们的分数。该表将保存 1,000,00 条记录。
  2. 你有一个 CRON 脚本,它每 15 分钟运行一次。
  3. cron 第一次运行时,它会创建 1,000,000 行。不计算分数。这可以通过计算表中的行数来完成。如果 count==0 那么它是第一次运行
  4. 第二次和之后的运行,它选择 1000 条记录,并计算它们的分数并更新时间戳。它应该选择按时间戳排序的 1000 条记录,以便选择 1000 条最旧的记录。
  5. 让它在后台运行,每 15 分钟左右一次。总共需要大约 10 天的时间来计算所有分数。
  6. 每当您更新产品时,您都需要重置链接表上的日期,以便在 cron 运行时重新计算提及该项目的所有行的分数。
  7. 创建新产品时,必须创建链接行,因此必须为每个其他项目添加一行

就个人而言,我会考虑完全使用不同的方法,那里有很多算法,你只需要找到一个适用于这种情况的算法。这是一个例子:

此外,这里是用 PHP 编写的 Jaccard 索引,它可能比您当前的方法更有效

于 2013-09-13T15:50:42.677 回答