使用Elasticsearch作为Rails的全文搜索引擎

ElasticSearch 是什么?

ElasticSearch是基于Apache Lucene的开源全文搜索系统,与Solr相同运行。
ElasticSearch的特点是具备完善的REST API,并且可以通过JSON进行交互通信。

这里提供的是选择题,但在这种情况下,不能提供验证的选项。以下是一个可能的答案:

备齐。

由于ElasticSearch是通过Java运行的,因此在使用之前需要先安装Java。

如果你使用Mac,安装ElasticSearch非常简单,因为有brew可用。

$ brew install elasticsearch

在Windows上下载Zip文件,然后只需运行.bat文件就很简单。

ElasticSearch中提供了各种插件,其中包括了日语支持的插件。我们将使用elasticsearch-analysis-kuromoji来进行kuromoji分析。

只需要用git的简短地址通过plugin命令传递给插件安装命令,即可轻松安装插件。

$ plugin --install elasticsearch/elasticsearch-analysis-kuromoji/1.5.0

现在可以使用kuromoji作为插件。
在使其支持日语时,您可以在后面提到的rails模型中为每个字段指定kuromoji作为分析器,或者您也可以在设置文件(如果是mac的话,路径为/usr/local/opt/elasticsearch/config/elasticsearch.yml)中附加以下内容来指定它作为默认分析器。

index.analysis.analyzer.default.type: custom
index.analysis.analyzer.default.tokenizer: kuromoji_tokenizer

在浏览器中有多个插件可以用于检查ElasticSearch的状态。
这次我们将尝试安装基本的elasticsearch-head插件。

$ plugin --install mobz/elasticsearch-head

安装elasticsearch-head插件后,通过访问http://localhost:9200/_plugin/head/,可以在浏览器中进行各种确认。

样本Rails应用程序

创建一个用于处理ElasticSearch的示例应用程序。
执行”bundle init”命令创建Gemfile并在其中添加rails,并执行”bundle exec rails new”命令。

我想尝试全文搜索,所以我会处理新闻文章。
我将文章模型命名为”article”,并尝试为其添加标题和正文。

$ bundle exec rake db:create                                                                                                               
$ bundle exec rails g scaffold article title:string body:text                                                                              
$ bundle exec rake db:migrate

合作

使用tire来连接Rails和ElasticSearch。在Gemfile文件中添加gem ‘tire’,并运行bundle install。

然后在模型中写入与ElasticSearch的连接。

app/models/article.rb 文件

class Article < ActiveRecord::Base
  include Tire::Model::Search
  include Tire::Model::Callbacks

  mapping do
    indexes :title, analyzer: :kuromoji
    indexes :body, analyzer: :kuromoji
  end

  def self.search(params)
    tire.search(load: true) do
      query {
        string "body:#{params[:search]} title:#{params[:search]}"
      } if params[:search].present?
    end
  end
end

控制器将Article.all的调用更改为从ElasticSearch进行搜索。

app/controllers/articles_controller.rb的index方法

def index
    @articles = Article.search(params)
    # @articles = Article.all
end

将搜索框添加到View中。

app/views/articles/index.html.erb的视图文件

<%= form_tag articles_path, :method => :get do %>
  <%= text_field_tag :search, params[:search] %>
  <%= submit_tag "Search", :name => nil %>
<% end %>
<%= link_to 'clear', articles_path %>

只需通过http://localhost:3000/articles访问并随意填入新闻文章的数据,然后在搜索框中输入关键字即可进行搜索。

广告
将在 10 秒后关闭
bannerAds