【发布时间】:2010-09-28 01:34:29
【问题描述】:
我正在创建一个允许用户提交报价的网站。我将如何创建一个(相对简单?)返回最相关引号的搜索?
例如,如果搜索词是“turkey”,那么我将返回引号,其中“turkey”一词出现在引号之前出现两次,而引号仅出现一次。
(我会添加一些其他规则来帮助过滤掉不相关的结果,但我主要关心的是。)
【问题讨论】:
-
老实说,SQL(任何变体)都不太擅长这种事情。
我正在创建一个允许用户提交报价的网站。我将如何创建一个(相对简单?)返回最相关引号的搜索?
例如,如果搜索词是“turkey”,那么我将返回引号,其中“turkey”一词出现在引号之前出现两次,而引号仅出现一次。
(我会添加一些其他规则来帮助过滤掉不相关的结果,但我主要关心的是。)
【问题讨论】:
【讨论】:
使用Google Custom Site Search。我听说他们对搜索略知一二。
【讨论】:
Stackoverflow plans to use Lucene 搜索引擎。有一个为 Zend 框架编写的 PHP 端口,但可以作为一个单独的实体下载,而不需要所有的 ZF 膨胀。这称为 Zend_Search_Lucene,documentation for which can be found here。
【讨论】:
如果你想自己写,看看phpBB的实现。他们有两个表,第一个是出现在条目中的所有单词的唯一列表,第二个是单词和条目之间的多对多引用。然后,您可以进行分组并计数,以按照您要查找的方式对条目进行排序。
这比实现第三方搜索引擎(或全文搜索)要多得多,但它可以让您更好地控制结果。
【讨论】:
如果您查询的次数不多(我认为您每天可以免费获得 1k 次查询)或者您愿意付费,那么 Google 自定义站点搜索非常棒。
MySQL 的全文搜索也是一个很好的资源(如前所述)。
Yahoo 的 BOSS 是一个有趣的项目——我将在下一个搜索项目中试一试。
最后,如果您需要比全文更强大的功能,但又想调整自己的搜索引擎,Lucene 是一个很好的资源。 http://lucene.apache.org
【讨论】:
你的 sql 看起来像这样(你试图在其中找到带有 'turkey' 的引号):
SELECT * FROM Quotes
WHERE the_quote LIKE "%turkeyt%";
从那里你可以弄清楚如何处理它向你吐出的任何东西。
小心处理恶意用户可能inject malicious SQL 进入您的数据库的情况,特别是如果您打算将其放在 www.不过,如果您这样做是为了好玩,我想这只是您想学习的内容。
如果您不熟悉数据库和 sql,我建议您使用 sqlite 而不是 mysql。 非常更容易设置和使用,就像没有设置一样。它将帮助您解决第一次必须安装和设置 mysql 的潜在麻烦。
【讨论】:
每个人都建议使用 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 全文很可能会导致您更改数据库架构。
【讨论】:
几天前我遇到了Zoom Search Engine,认为这可能是我用过的最简单的搜索引擎。
基于 Windows 的工具会创建站点的数据库,然后它还会询问您要使用哪种语言(PHP、ASP.NET、JavaScript 等)。我选择了 PHP,它为我构建了 PHP 代码。然后,我要做的就是将文件上传到服务器并(可选)自定义模板,然后站点搜索就可以工作了。
这对小型网站是免费的,我能找到的唯一缺点是蜘蛛工具(数据库构建器)必须在 Windows 上运行。
【讨论】:
这里有一个更简单、更容易操作的开源替代 Solr / Lucene:
【讨论】: