对此要补充的是full text searching
使用 Rails 的想法。如果您正在执行搜索,则需要注意您实际上是在数据库中执行全文“搜索”查询,这取决于您使用的 SQL 引擎
MYSQL全文搜索
该LIKE %{search}%
机制是 MYSQL 非常基本的全文搜索功能,基本上在您的数据库中的整个记录中查找您的目标查询。这意味着如果您的查询是这样的:
SELECT * FROM `products` WHERE `name` LIKE '%alligator%'
MYSQL 基本上会查看整个“名称”记录以查找对您查询的任何引用。结果将取决于您的记录是否有任何部分包含“鳄鱼”一词。这个参考解释了更多关于这个
PostgreSQL 全文搜索
我写这篇文章的原因是因为 PSQL 实际上以不同的方式执行此操作,因此您提供的查询仅适用于 MYSQL。PSQL 有很多不同的函数来处理全文搜索,但由于我们使用 Heroku,我们设法使用Textacular gem来让它正常工作
以下是PSQL 处理全文搜索的一些方法:
PostgreSQL 中的全文搜索基于匹配运算符@@,如果 tsvector(文档)与 tsquery(查询)匹配,则返回 true。首先写入哪种数据类型并不重要:
SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector @@ 'cat &
rat'::tsquery; ?column?
---------- t
SELECT 'fat & cow'::tsquery @@ 'a fat cat sat on a mat and ate a fat
rat'::tsvector; ?column?
---------- f
正如上面的例子所暗示的,一个 tsquery 不仅仅是原始文本,不仅仅是一个 tsvector > 。tsquery 包含搜索词,这些词必须是已经规范化的词位,并且可以使用 AND、OR 和 NOT 运算符组合多个词。(有关详细信息,请参阅第 8.11 节。)有一些函数 to_tsquery 和 plainto_tsquery 有助于将用户编写的文本转换为适当的 tsquery,例如通过规范化文本中出现的单词。类似地,to_tsvector 用于解析和规范化文档字符串。所以在实践中,文本搜索匹配看起来更像这样:
SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat'); ?column?
---------- t Observe that this match would not succeed if written as
SELECT '肥猫吃了肥鼠'::tsvector @@ to_tsquery('fat & rat'); ?柱子? - - - - - F
全文检索软件
全文搜索在数据库上本质上是相当昂贵的,尤其是当您有大量数据要搜索时。这就是存在诸如sunspot solr或sphinx之类的解决方案的原因——提供一种索引和搜索您拥有的数据的方法
如果您的应用程序变得非常流行,您可能希望投资于全文搜索系统之一,例如Heroku 演示的这些系统: