【问题标题】:php/mysql/ajax: google style search with suggestionsphp/mysql/ajax:带有建议的谷歌风格搜索
【发布时间】:2013-01-13 17:57:11
【问题描述】:

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

例如,如果你搜索 att,你会得到 att,但也会得到 attention、attaboy、buratta 等。

Google 等优秀的搜索引擎似乎有一个经过其他人审查的中间建议表。他们似乎不是直接搜索数据,而是搜索批准的短语,例如 AT&T,并成功地缩小了结果的数量。有没有人编写过这样的代码并建议正确的 dbase 架构和查询以获得相关结果。

现在我正在直接搜索名称表,例如

$sql = "SELECT lastname from people WHERE lastname LIKE '%$searchstring%'";

我想除了人之外,我应该按照以下方式创建一些中间表

id|firstname|lastname|description

好词

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。只是想缩小搜索结果的范围,使其具有相关性。

感谢您的任何建议。

【问题讨论】:

    标签: php mysql ajax


    【解决方案1】:

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

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

    • p1.name 字段是否包含 Bl 或 rock?如果是 -> 添加分数
    • p1.name 字段是否以 Bl 或 rock 开头?如果是 -> 添加分数
    • p1.name 等于 Bl 摇滚吗?如果是 -> 添加分数

      MATCH p1.name 反对('>Bl* >rock* >((+Bl*) (+rock*)) >("Bl rock")' IN BOOLEAN MODE) AS match

    现在只需按match 订购,它就会向您显示最相关的搜索。您还可以将 order by 与多个语句组合并添加如下限制:

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

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

    请记住,上面的代码以某种方式根据常见情况创建了相关结果。复制谷歌将是不可能的,因为他们的最佳结果/速度算法令人难以置信。

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

    【讨论】:

    • 那么您将使用创建匹配列的语句部分改进结果?
    • 是的。基于相关性当您输入 Rock 时,第一个结果将是 Rock,然后是 Rockability,然后是 Hardrock,例如
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    相关资源
    最近更新 更多