为网站创建智能预测搜索

时间:2013-10-24 12:52:16

标签: php mysql sql ajax search

我正在尝试为我正在制作的网站编写预测搜索系统。

完成的功能将非常类似:

enter image description here

我不确定这样做的最好方法,但到目前为止我还有:

搜索表:
id - term - count

每次进行搜索时,都会将其插入搜索表中。


当用户在搜索输入中输入字符时,会发生以下情况:

  1. 该页面向搜索PHP文件发出AJAX请求
  2. PHP文件连接到MySQL数据库并执行查询:SELECT * FROM searches WHERE term LIKE 'x%' AND count >= 10 ORDER BY count DESC LIMIT 10(x =搜索输入中的文本)
  3. 然后在页面上列出基于过去搜索条件的10个最高结果

  4. 这个解决方案远非完美。如果任何随机人员搜索相同的术语10次,那么它将显示为推荐搜索(如果有人在哪里搜索以相同字符开头的术语)。我的意思是,如果有人搜索“poo poo”10次,然后网站上有人搜索“po”寻找土豆,他们会将“poo poo”视为热门搜索。 这不酷

    我想到了解决这个问题的一些想法。例如,我可以将每个插入查询限制在搜索表中,以限制用户的IP地址。但这并没有完全解决问题,如果用户有动态IP地址,他们可以重新启动调制解调器并在每个IP地址上执行10次搜索。当然,它必须输入的次数可能仍然是一个秘密,所以它更安全。

    我想另一个解决方案就是添加一个黑名单来删除像“poo poo”这样的单词。

    我的问题是,有更好的方法可以做到这一点,还是我沿着正确的方向前进?我想编写能够扩展的代码。

    由于

2 个答案:

答案 0 :(得分:2)

你走在正确的轨道上。

我会做什么:

  1. 您可以唯一地存储每个查询。添加一个表格,跟踪该搜索字词的每个IP,并且每个IP只更新一次计数
  2. 如果某个新/唯一关键字在X时间内上传超过X次,请让您的系统向您/您的管理员发送邮件,以便您有机会手动将其关键字列入黑名单。这必须是手动的,因为一些热门话题也可能会显示这种行为。
  3. 这是最有趣的一个:查询完成后,检查结果的数量。建议没有结果的关键字毫无意义。所以只建议至少会给出X量的结果的查询。像“poo poo”这样的查询将不会显示任何结果,因此它们不会显示在您的建议列表中。
  4. 我希望这会有所帮助。如果您有疑问,请在聊天中与我联系:)

答案 1 :(得分:0)

例如,您可以添加一个名为validate的新布尔列,并避免使用黑名单。如果validate为false,则不会出现在推荐列表中

此字段可由管理员手动调整(通过查询或后台工具)。您可以添加另一个名为audit的列,该列存储查询的时间戳。如果最大和最小时间戳之间的差异超过某个值,则默认情况下验证字段可能为false。

这个解决方案可以轻松快速地发展您的想法。

问候并祝你好运。