Rails 中的全文搜索
介绍
在Web应用中,搜索数据记录是一个常见的需求。最常见的一个需求就是允许用户从大量的数据记录中快速访问他们想要的数据。虽然可以使用简单的SQL查询应对这样的查询需求,但有时,更有效的是使用搜索引擎。
Solr是Apache Lucene项目中的一个流行的搜索平台。其主要功能包括强大的全文搜索,点击显示,分面搜索,近实时索引,动态聚类,数据库集成,富文本处理和空间搜索。在本教程中,我们将寻求利用Sunspot执行全文本搜索,Sunspot是一个能够使Solr集成在ruby应用中的类库。
相关阅读:
Ruby on rails初体验系列文章:
项目安装
我在 Github 创建了一个简单的app, 我将用在这里而不是开始一个全新的项目。这个 app 显示了一个产品列表,包括产品名,图片,价格和描述。我引用了一些 seed 数据,所以如果你不想自己输入数据的话, 你可以运行 rake db:seed 。这个应用程序使用了Paperclip处理图片附件,因为我用到图片大小调整,所以在你的系统需要装上ImageMagick。随教程的进行你还需要在你的机器安装Java运行环境。
下面图片展示了这个应用程序。顶部的搜索表单现在还没做什么,但是我们将使得一个用户通过搜索产品并得到基于不仅仅是产品名,也包括它的商品描述的结果。
搜索
首先我们要将Sunspot和Solr引入到我们的依赖库中. 在开发中, 我们会使用预打包有Solr发行版的sunspot_solr依赖包, 这样我们就不需要单独安装它了.
gem 'sunspot_rails'
group :development do
gem 'sunspot_solr'
end
运行 bundle install 生成Sunspot配置文件.
rails generate sunspot_rails:install
这里创建了文件 /config/sunspot.yml 用以让你的应用知道在哪里找到 Solr 服务器.
建立为你想要索引的对象, 并为其添加searchable块. 在starter project中, 我们有一个含有name, price, description 和 photo字段的Product模型. 我们要为字段 name 和description 添加全文搜索. 在/models/product.rb中添加:
searchable do
text :name, :description
end
通过执行下面的语句启动Solr服务器:
rake sunspot:solr:start
Sunspot 索引你添加的新记录 , 但是如果数据库中已经有了许多数据, 执行 rake sunspot:reindex 来索引他们.
然后我们将代码放入 Products 控制器中,它将会得到用户的输入并将其传入搜索引擎. 在下面的代码中,我们在一个Product模型上面调用搜索并传入一个块. 我们在这个块中调用 fulltext 方法并传入我们想要搜索的查询字符串. 这里我们可以使用到几个方法来定制我们想要的搜索结果. 然后搜索结果就会被赋值给 @products,它将会作用于我们的视图.
def index
@query = Product.search do
fulltext params[:search]
end
@products = @query.results
end
运行应用程序,你就应当能够用这个程序来搜索可用的产品了.
Solr 将会使用输入的关键词或者短句对产品的名称和描述做一个大小写敏感的搜索. 你可以通过让某个域拥有比其它域更多的权重来提升搜索结果的相关性. 这是由 boost 方法来 做到的,它会被传入一个值来决定不同域的权重. 带有最大值的域将取得更多的重视.
在我们的应用程序中,我们可以让在名称中搜索到关键字符串的产品设置一个较高的分数. 我们可以通过在/models/product.rb中进行如下改变来做到.
searchable do
text :name, :boost => 2
text :description
end
使用 rake sunspot:reindex 可以对记录进行重新索引,而现在在产品名称中搜索到关键字的产品将会比在产品描述中搜索到关键字的产品排名要高. 你可以添加更多的记录来测试这一点.