我有一个存储all_words列的搜索记录。它是由空格分隔的单词列表。我有另一个名为Lead的模型。我想搜索引导表的所有行的所有列以获取all_words中的值。并且将检索在其任何列中产生匹配的任何记录。有点像这样:
possible_values = search.all_words.split
Lead.where(first_name: possible_values )
.where(last_name: possible_values )
.where(status: possible_values )
...
但这看起来并不干净。我怎么能这样做呢?
答案 0 :(得分:0)
您正在寻找的是全文搜索。根据您拥有的数据库类型,您将使用不同的策略。
您可以根据需要在任意数量的列上创建搜索索引。
对于Postgresql
好消息是Postgresql已经具备全文搜索功能。您可以使用这些宝石从中受益。
对于Mysql
Dusen(在MySQL和LIKE查询中使用FULLTEXT索引功能)
Thinking sphinx(使用Sphinx搜索服务器)
Sunspot(使用solr搜索服务器)
答案 1 :(得分:0)
<强>索引强>
您将更适合使用基于索引的搜索解决方案
前几天我写了这篇文章 - 如果您要“搜索”您的数据库(特别是多个属性),您确实需要使用第三方解决方案来访问您需要的数据。
跨越所有SQL版本搜索数据库的“常用”方法是使用full text search
(它基本上在不同属性/列的数组中查找信息,而不是特定匹配)。
以下解决方案在基于Rails的项目中很受欢迎:
-
<强>参考强>
这些的神奇之处在于,它们将索引您希望搜索的任何数据,并将数据存储在半持久数据集中。
这一点非常重要,因为全文搜索数据库的一个主要原因是错误的想法是它将导致的性能影响。您最好使用上述宝石中的一种来使其正常工作
这里有一个good Railscast: