我正在构建一个用户可以搜索帖子的网站。每个帖子都存储在数据库中。当用户进行搜索时,例如iPad Mini FOR SALE查询将如下所示:
SELECT * FROM testtable WHERE title REGEXP 'iPad|Mini|FOR|SALE'
然后查询将产生以下3个项目:
前两个项目的搜索成功,但第三个项目实际上不属于该组。我想过滤掉它,只是向搜索显示相关项目。我正在考虑删除像for,is,are等常用词,但也许你们有什么建议吗?
旁注:你们推荐“REGEXP”吗?我刚刚看到它,使用它,并没有深入研究它。 (不需要回答这个问题只是搜索过滤器问题,但是如果你有一些很好的信息会很棒。)
答案 0 :(得分:2)
您还应该查看FULLTEXT
搜索。
为了使FULLTEXT
搜索工作你需要MyIsam
MySQL表引擎类型,也有innoDB支持,但我不太了解它。
答案 1 :(得分:1)
已经开头这个话题? http://www.regular-expressions.info/mysql.html 或者这也是一个很好的教程/解释:http://www.tech-recipes.com/rx/484/use-regular-expressions-in-mysql-select-statements/
答案 2 :(得分:1)
是,删除常用字词
这些被称为stop words。这些词通常是无关紧要的。
考虑相关性
标题为'ipad mini for sale'的帖子与搜索[ipad mini for sale]的用户非常相关。一篇名为“ipad for sale”的帖子不太相关。一篇名为“奶酪工厂待售”的帖子仍然不太相关。
考虑推导出一种算法,用于计算您认为与您网站上的帖子相关的内容以及用户搜索的字词。
算法可以像查看搜索的术语和帖子标题中术语的出现一样简单。搜索的所有术语是否都出现在标题中?可能非常相关。是否有10%的条款在标题中出现?可能非常无关紧要。
考虑如何计算相关性得分。设置一个阈值,低于该阈值时,结果与结果中的结果无关。根据经验,我建议设定门槛相当高,仅针对高度相关的结果,可能只有在找不到高度相关的结果时才列出不太相关的结果
使用词干
顺便说一句,在搜索中使用词干。词干算法会将单词缩减为常见词干。您将仅搜索词干而不是完整的搜索词。阅读stemming。找到您正在使用的语言的移植器词干算法的实现;这是一个长期存在的算法,从经验来看,它对于大多数应用来说都是快速且非常好的。
<强> REGEXP吗
如果删除停用词并使用基于干的方法,这将是一个不太相关的问题。无论如何,这是一个实施问题,并且可能过于主观,无法为您提供有意义的答案。试试吧,检查一下表现。尝试另一种方法,检查性能。使用最适合你的方式。