1

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

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

像谷歌这样的优秀搜索引擎似乎有一个经过其他人审查的中间建议表。他们似乎不是直接搜索数据,而是搜索批准的短语,例如 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。只想缩小搜索结果的范围,使其具有相关性。

感谢您的任何建议。

4

1 回答 1

0

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

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

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

    匹配p1name反对('>Bl* >rock* >((+Bl*) (+rock*)) >("Bl rock")' 在布尔模式中) ASmatch

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

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

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

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

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

于 2013-01-30T01:42:47.320 回答