我正在创建一个允许用户提交引号的网站.我将如何创建一个(相对简单的?)搜索,返回最相关的引号?
例如,如果搜索词是"turkey",那么我会返回引号,其中单词"turkey"在引号之前出现两次,只出现一次.
(我会添加一些其他规则来帮助过滤掉不相关的结果,但我主要担心的是.)
每个人都建议使用MySQL全文搜索,但是你应该知道一个巨大的警告.全文搜索引擎仅适用于MyISAM引擎(不是InnoDB,由于其参照完整性和ACID合规性,它是最常用的引擎).
所以你有几个选择:
1.最简单的方法是通过概括粒子树.您可以从纯SQL中获取排名搜索(没有全文,没有任何内容).下面的SQL查询将搜索表并根据搜索字段中字符串的出现次数对结果进行排名:
SELECT SUM(((LENGTH(p.body) - LENGTH(REPLACE(p.body, 'term', '')))/4) + ((LENGTH(p.body) - LENGTH(REPLACE(p.body, 'search', '')))/6)) AS Occurrences FROM posts AS p GROUP BY p.id ORDER BY Occurrences DESC
编辑了他们的例子以提供更多的清晰度
上面的SQL查询的变化,添加WHERE语句(WHERE p.body LIKE'%,无论你想要多少%)等等,可能会得到你所需要的.
2.您可以更改数据库架构以支持全文.通常,为了保持InnoDB参照完整性,ACID合规性和速度而不必安装像Sphinx全文搜索引擎 for MySQL 这样的插件,将报价数据拆分为自己的表.基本上你会有一个表引用,它是一个InnoDB表,而不是你的TEXT字段"data"你有一个引用"quote_data_id",它指向一个Quote_Data表上的ID,这是一个MyISAM表.您可以在MyISAM表上进行全文,加入与InnoDB表一起返回的ID,然后就可以得到结果.
3.安装Sphinx.祝你好运.
鉴于您所描述的内容,我强烈建议您采用我提出的第一种方法,因为您有一个简单的数据库驱动站点.第一个解决方案很简单,快速完成工作.如果你想将Lucene与数据库集成,Lucene将会成为一个蠢事,因为Lucene主要用于索引文件而不是数据库.Google自定义网站搜索只会让您的网站失去大量声誉(让您看起来很业余和被黑客攻击),而且MySQL全文很可能会导致您更改数据库架构.
使用Google自定义网站搜索.我听说他们对搜索有所了解.