我有一个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。只是想缩小搜索结果,使它们相关。
感谢您的任何建议。
答案 0 :(得分:0)
你可能想看看Mysql中的FULLTEXT搜索。它允许您根据相关性创建强大的查询。例如,您可以创建一个BOOLEAN搜索,允许您在结果中创建一个记分。分数将基于规则,例如文本以karakter组合开头(是吗?+ 2,否,但确实包含组合:+1)
以下代码只是另一列,其中有3条规则:
p1
。name
字段是否包含Bl或rock?如果是 - >添加分数p1
。name
字段是以Bl还是摇滚开头的?如果是 - >添加分数 p1
。name
等于Bl rock?如果是 - >添加分数
MATCH p1
。name
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搜索是一个很大的步骤,请尝试制作标签系统。使用唯一标记组合标记内容也会产生更可靠的搜索结果