php / mysql / ajax:带有建议的谷歌样式搜索

时间:2013-01-30 01:26:06

标签: php mysql ajax

我有一个ajax脚本,可以在数据库表中搜索类似于谷歌搜索的表达式。 SELECT语句只使用LIKE并在相关字段中查找匹配项。它起初工作正常,但随着内容的增长,它为大多数搜索字符串提供了太多的匹配。

例如,如果你搜索att,你会得到吸引力,但也会受到关注,成就,buratta等。

像谷歌这样的好搜索引擎似乎有一个中间的建议表,这些建议已被其他人审查过。他们似乎不是直接搜索数据,而是搜索已批准的短语,例如AT& T,并成功缩小结果数量。有没有人编写类似这样的内容并建议正确的dbase架构和查询以获得相关结果。

现在我正在用

之类的东西直接搜索名字表
$sql = "SELECT lastname from people WHERE lastname LIKE '%$searchstring%'";

我想除了人之外,我应该按照

的方式创建一些中间表

id|firstname|lastname|description

niceterms

id|niceterm|peopleid

然后查询可能是:

$sql = "SELECT p.lastname,p.peopleid, n.niceterm, n.peopleid,
FROM `people` p
LEFT JOIN `niceterms` n
on p.id = n.peopleid
WHERE niceterm LIKE '%$searchterm%'";

..因此,当您在搜索框中输入内容时,您会获得更好的搜索字词,从而产生更好的效果。

但是我如何填充niceterms表。这是正确的方法吗?我不是要创建一个完整的backweb或pagerank。只是想缩小搜索结果,使它们相关。

感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

你可能想看看Mysql中的FULLTEXT搜索。它允许您根据相关性创建强大的查询。例如,您可以创建一个BOOLEAN搜索,允许您在结果中创建一个记分。分数将基于规则,例如文本以karakter组合开头(是吗?+ 2,否,但确实包含组合:+1)

以下代码只是另一列,其中有3条规则:

  • p1name字段是否包含Bl或rock?如果是 - >添加分数
  • p1name字段是以Bl还是摇滚开头的?如果是 - >添加分数
  • p1name等于Bl rock?如果是 - >添加分数

    MATCH p1name AGAINST('> Bl *> rock *>((+ Bl *)(+ rock *))>(“Bl rock”)'IN BOOLEAN MODE)AS match

现在只需按match排序,它会显示最相关的搜索。您还可以将订单与多个报表合并,并添加如下限制:

按最近日期,最高匹配排序,然后按字符长度排列具有相同分数的匹配

ORDER BY `date` DESC, `match` DESC, LENGTH(`p1`.`name`) ASC

请记住,上面的代码会以某种方式根据常见情况创建相关结果。复制Google将是不可能的,因为他们的算法可以获得最佳的结果/速度。

如果FULLTEXT搜索是一个很大的步骤,请尝试制作标签系统。使用唯一标记组合标记内容也会产生更可靠的搜索结果