我正在创建一个网站,允许用户提交引用语。如何创建一个(相对简单的)搜索功能,以返回最相关的引用语?
例如,如果搜索词是“turkey”,那么我将返回出现两次“turkey”单词的引用语,然后是仅出现一次的引用语。
(我会添加一些其他规则来帮助过滤掉不相关的结果,但我的主要关注点是这个。)
大家都建议使用MySQL全文搜索,但是你应该知道一个巨大的警告。全文搜索引擎仅适用于MyISAM引擎(不适用于InnoDB引擎,后者是由于其参照完整性和ACID兼容性而被广泛使用)。
所以你有几个选择:
1. 最简单的方法是由Particle Tree概述。您实际上可以通过纯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 '%whatever%you%want'),等等,可能会让您得到所需的结果。
2. 您可以更改数据库架构以支持全文检索。通常所做的是将引用完整性、ACID兼容性和速度保持在不必安装像Sphinx Fulltext Search Engine这样的MySQL插件的前提下,将引用数据拆分为自己的表格。基本上,您将拥有一个名为Quotes的InnoDB表,它不再具有您的TEXT字段"data",而是具有指向Quote_Data表上的ID的引用"quote_data_id",该表是一个MyISAM表。您可以在MyISAM表上执行全文搜索,将返回的ID与InnoDB表连接起来,然后就可以获得结果了。
3. 安装Sphinx。祝您好运。
考虑到您所描述的情况,我强烈建议采用我提出的第一种方法,因为您拥有一个简单的数据库驱动站点。第一种解决方案简单易行,快速解决问题。Lucene将是一个麻烦的设置,特别是如果您想将其与数据库集成,因为Lucene主要设计用于索引文件而不是数据库。Google自定义网站搜索只会让您的网站失去大量声誉(使您看起来业余和不专业),而MySQL全文检索很可能会导致您更改数据库架构。
Stackoverflow 计划使用 Lucene 搜索引擎。这是一个为 Zend Framework 编写的 PHP 移植版本,但可以作为独立实体下载,无需所有的 ZF 冗余。这被称为 Zend_Search_Lucene,其文档可以在此处找到。
几天前我发现了Zoom Search Engine,我认为这可能是我使用过的最简单的搜索引擎。
这个基于Windows的工具创建了一个站点的数据库,然后它还会询问您想要使用哪种语言(PHP、ASP.NET、JavaScript等)。我选择了PHP,它为我构建了PHP代码。然后,我所需要做的就是将文件上传到服务器上,(可选)自定义模板,站点搜索就可以工作了。
对于小型网站来说,这是免费的,唯一的缺点是蜘蛛工具(数据库构建器)必须在Windows上运行。
谷歌自定义站点搜索很好,如果您不经常查询它(我认为您可以免费获得每天1k个查询),或者您愿意付费。
MySQL的全文搜索也是一个很好的资源(正如以前提到的那样)。
雅虎的BOSS是一个有趣的项目 - 我将在我的下一个搜索项目中尝试它。
最后,Lucene是一个很好的资源,如果您需要比全文搜索更强大的功能,但想要调整自己的搜索引擎。http://lucene.apache.org