我正在创建一个允许用户提交报价的网站。如何创建返回最相关引号的(相对简单?)搜索?
例如,如果搜索词是“土耳其”,那么我将返回引号,其中单词“土耳其”出现两次,而引号则只出现一次。
(我会添加一些其他规则来帮助过滤掉不相关的结果,但是我主要担心的是。)
每个人都建议使用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’%whatever%you%want’)等,可能会完全满足您的需求。
2. 您可以更改数据库架构以支持全文。无需安装Sphinx Fulltext Search Engine for MySQL之类的插件来保持InnoDB引用完整性,ACID遵从性和速度的通常做法是将报价数据拆分到其自己的表中。基本上,您将有一个Quotes表,它是一个InnoDB表,而不是您的TEXT字段为“ data”,而是具有引用“ quote_data_id”,该引用指向Quote_Data表(即MyISAM表)上的ID。您可以在MyISAM表上使用全文本,将InnoDB表返回的ID合并在一起,然后就可以得到结果。
3. 安装Sphinx。祝你好运。
鉴于您的描述,我 强烈 建议您采用我介绍的第一种方法,因为您有一个简单的数据库驱动站点。第一种解决方案很简单,可以快速完成工作。Lucene将非常麻烦地进行设置,尤其是当您要将Lucene与数据库集成时,Lucene的主要目的是索引文件而不是数据库。Google自定义站点搜索只会使您的站点失去大量声誉(使您看起来很业余和被黑),而MySQL全文很可能会导致您更改数据库架构。