在 Rails 4.1 中使用 Searchkick gem 在 Elasticsearch 中设置 Facets

Posted

技术标签:

【中文标题】在 Rails 4.1 中使用 Searchkick gem 在 Elasticsearch 中设置 Facets【英文标题】:Setting up Facets in Elasticsearch with Searchkick gem in Rails 4.1 【发布时间】:2014-06-14 18:29:53 【问题描述】:

我希望用户能够轻松找到系列,因此希望设置构面。我已按照seachkick 的指示进行操作,一切正常,但是当我设置 Facets 时,我得到以下回报。我希望它像他们的文档中一样。希望有人能帮忙。

我在 myapp.com/movies 中得到了这个


  "name"=> 
    "_type"=> "terms",
    "missing"=> 0,
    "total"=> 1,
    "other"=> 0,
    "terms"=> [
      
        "term"=> "Bloop",
        "count"=> 1
      
    ]
  ,
  "imdb"=> 
    "_type"=> "terms",
    "missing"=> 0,
    "total"=> 1,
    "other"=> 0,
    "terms"=> [
      
        "term" => "http://www.bloop.com",
        "count" => 1
      
    ]
  


#app/views/movies/index.html.erb
<%= p @series.facets %>

#app/controllers/movies_controller.rb
def index
  query = params[:query].presence || "*"
  @movies = Movie.search(query, page: params[:page],
                                suggest: true,
                                per_page: 20,
                                facets: [:name, :imdb])
end

#db/schema.rb
create_table "movies", force: true do |t|
  t.string   "name"
  t.text     "description"
  t.string   "imdb"
  t.string   "year"
  t.datetime "created_at"
  t.datetime "updated_at"
end

【问题讨论】:

【参考方案1】:

我终于通过执行以下操作使其正常工作。不确定这是否是最好的方法,但它有效!希望对您有所帮助,如果您有任何改进或建议,请随时告诉我。

# app/models/movie.rb
def self.facets_search(params)
  query = params[:query].presence || "*"
  conditions = 
  conditions[:year] = params[:year] if params[:year].present?

  movies = Movie.search query, where: conditions, 
    facets: [:year], 
    smart_facets: true, page: params[:page], suggest: true, highlight: true,
    per_page: 10
  movies
end

.

# app/controllers/movies_controller.rb
def index
  @movies = Movie.facets_search(params)
end

.

# app/views/movies/index.html.erb
<% if @movies.facets["year"]["terms"].present? %>
    <div>
        <ul>
        <% @movies.facets["year"]["terms"].each do |filter| %>
          <li><%= link_to "#filter["term"] (#filter["count"])", "/movies?year=#filter["term"]" %></li>
        <% end %>
        </ul>
    </div>
<% end %>

【讨论】:

@crentist 如果选择了构面,你如何维护query

以上是关于在 Rails 4.1 中使用 Searchkick gem 在 Elasticsearch 中设置 Facets的主要内容,如果未能解决你的问题,请参考以下文章

在Rails 4.1中,如何通过枚举符号查找记录?

在 Rails 4.1 中将页面特定的 jQuery 代码放在哪里?

rails 4.1 无法通过 capistrano 3 部署

使用 Ruby 2.0、Rails 4.1、nginx 更改 Elastic Beanstalk 的文件大小限制

禁用 Asset Pipeline/Sprockets Rails 4.1

字形在 Ubuntu Rails 4.1 安装中未正确显示