如何使用 php 和 mySQL 实现简单的站点搜索?
Posted
技术标签:
【中文标题】如何使用 php 和 mySQL 实现简单的站点搜索?【英文标题】:How would I implement a simple site search with php and mySQL? 【发布时间】:2010-09-28 01:34:29 【问题描述】:我正在创建一个允许用户提交报价的网站。我将如何创建一个(相对简单?)返回最相关引号的搜索?
例如,如果搜索词是“turkey”,那么我将返回引号,其中“turkey”一词出现在引号之前出现两次,而引号仅出现一次。
(我会添加一些其他规则来帮助过滤掉不相关的结果,但我主要关心的是。)
【问题讨论】:
老实说,SQL(任何变体)都不太擅长这种事情。 【参考方案1】:我会选择全文搜索,请看这里:http://hockinson.com/fulltext-search-of-mysql-database-table.html
【讨论】:
【参考方案2】:使用Google Custom Site Search。我听说他们对搜索略知一二。
【讨论】:
我想自己做。每个报价都没有自己的页面,所以无论如何我认为谷歌不会很好地工作。【参考方案3】:*** plans to use Lucene 搜索引擎。有一个为 Zend 框架编写的 php 端口,但可以作为一个单独的实体下载,而不需要所有的 ZF 膨胀。这称为 Zend_Search_Lucene,documentation for which can be found here。
【讨论】:
我有一个疑问@DavidM:我有用 html 和 php 创建的网页。因此,我可以使用 Lucene 搜索引擎在我的网页中搜索任何单词吗?谢谢【参考方案4】:如果你想自己写,看看phpBB的实现。他们有两个表,第一个是出现在条目中的所有单词的唯一列表,第二个是单词和条目之间的多对多引用。然后,您可以进行分组并计数,以按照您要查找的方式对条目进行排序。
这比实现第三方搜索引擎(或全文搜索)要多得多,但它可以让您更好地控制结果。
【讨论】:
【参考方案5】:如果您查询的次数不多(我认为您每天可以免费获得 1k 次查询)或者您愿意付费,那么 Google 自定义站点搜索非常棒。
MySQL 的全文搜索也是一个很好的资源(如前所述)。
Yahoo 的 BOSS 是一个有趣的项目——我将在下一个搜索项目中试一试。
最后,如果您需要比全文更强大的功能,但又想调整自己的搜索引擎,Lucene 是一个很好的资源。 http://lucene.apache.org
【讨论】:
【参考方案6】:你的 sql 看起来像这样(你试图在其中找到带有 'turkey' 的引号):
SELECT * FROM Quotes
WHERE the_quote LIKE "%turkeyt%";
从那里你可以弄清楚如何处理它向你吐出的任何东西。
小心处理恶意用户可能inject malicious SQL 进入您的数据库的情况,特别是如果您打算将其放在 www.不过,如果您这样做是为了好玩,我想这只是您想学习的内容。
如果您不熟悉数据库和 sql,我建议您使用 sqlite 而不是 mysql。 非常更容易设置和使用,就像没有设置一样。它将帮助您解决第一次必须安装和设置 mysql 的潜在麻烦。
【讨论】:
这并没有给你一个排名(例如排名是火鸡的出现次数) 等等,什么?你的意思是我应该小心 SQL 注入?没门! :) 我正在考虑使用您描述的方法,但我认为将其转变为排名系统并不容易。 只是不确定您的技能水平。如果您想要一个简单的排名系统,您可以让用户为引号创建标签并搜索标签,因为引号不是大量的文本,您可能需要分析名词/动词来确定排名。或者只是计算一个单词的出现次数 我不完全理解“引用标签”的评论,但是当有这么多现有的强大选项时,我建议不要将这样的东西组合在一起。包括开箱即用的 MySQL...【参考方案7】:每个人都建议使用 MySQL 全文搜索,但是您应该注意一个巨大的警告。全文搜索引擎仅适用于 MyISAM 引擎(而非 InnoDB,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.您可以更改数据库架构以支持全文。通常,为了保持 InnoDB 的引用完整性、ACID 合规性和速度,而无需为 MySQL 安装像 Sphinx Fulltext Search Engine 这样的插件,可以将引用数据拆分到它自己的表中。基本上你会有一个表 Quotes 是一个 InnoDB 表,而不是你的 TEXT 字段“数据”,你有一个引用“quote_data_id”,它指向一个 MyISAM 表的 Quote_Data 表上的 ID。您可以在 MyISAM 表上执行全文,将返回的 ID 与您的 InnoDB 表连接起来,瞧,您就有了结果。
3. 安装Sphinx。祝你好运。
鉴于您所描述的,我会强烈建议您采用我提出的第一种方法,因为您有一个简单的数据库驱动网站。第一个解决方案很简单,可以快速完成工作。 Lucene 设置起来很麻烦,特别是如果您想将它与数据库集成,因为 Lucene 主要用于索引文件而不是数据库。 Google 自定义网站搜索只会让您的网站失去大量声誉(让您看起来很业余且被黑客入侵),而 MySQL 全文很可能会导致您更改数据库架构。
【讨论】:
选项 1 很有趣!以前从未见过。由于查询的复杂性,在实时数据上运行基准测试是必不可少的,但如果你有一个小数据集,它可能是 Sphinx/MyISAM 的一个很好的替代方案 从 MySQL 5.6 开始,全文搜索也可用于 InnoDB。【参考方案8】:作为 Sphinx 和 Lucene 的替代方案,可以使用 Xapian 库创建一个相对简单的搜索引擎。
+
支持许多高级搜索功能(例如相关性排名)+
快速
-
你需要学习 API 来创建你的界面-
需要安装一个 php 扩展
另请注意,Xapian 将其数据存储在 mysql 的单独索引中。
您可能还对Forage 感兴趣,它是 Solr、Xapian 和 Lucene 的包装器。
Xapian 人还创建了 Omega 搜索引擎,它是 Xapian 的前端,可以通过 cgi 调用。
【讨论】:
【参考方案9】:几天前我遇到了Zoom Search Engine,认为这可能是我用过的最简单的搜索引擎。
基于 Windows 的工具会创建站点的数据库,然后它还会询问您要使用哪种语言(PHP、ASP.NET、javascript 等)。我选择了 PHP,它为我构建了 PHP 代码。然后,我要做的就是将文件上传到服务器并(可选)自定义模板,然后站点搜索就可以工作了。
这对小型网站是免费的,我能找到的唯一缺点是蜘蛛工具(数据库构建器)必须在 Windows 上运行。
【讨论】:
【参考方案10】:这里有一个更简单、更容易操作的开源替代 Solr / Lucene:
http://github.com/typesense/typesense
【讨论】:
以上是关于如何使用 php 和 mySQL 实现简单的站点搜索?的主要内容,如果未能解决你的问题,请参考以下文章
带有 MySql 数据库的动态 PHP 网站;如何为此创建站点地图?