扩展搜索功能

时间:2015-12-14 20:57:31

标签: ruby-on-rails

我正在建立一个网站,其中有多个表格,详细说明了网站的功能,如汽车池,匹配,对手和注册用户。我添加了一个搜索功能,搜索网站上的匹配,但我不知道如何扩展这个,以便用户可以搜索汽车池详细信息,对手和注册用户。我可能只是重复我对匹配所做的事情,但这似乎效率低下,我确信必须有一种方法可以将所有匹配的信息捕获到输入的搜索词中。

有相当多的代码请耐心等待我 -

这是在matches_contoller.rb文件中:

 def search
 @search_term = params[:q]
 st = "%#{params[:q]}%"
 @matches = Match.where("Opponent like ?", st)


respond_to do |format|
  format.html # index.html.erb
  format.json { render json: @matches }
end  
end

我已使用以下代码将_search.html.erb添加到matches文件夹中:

  <%= form_tag("/search", :method => "post") do %>
  <%= label_tag(:q, "Search for:") %>
  <%= text_field_tag(:q) %>
  <%= submit_tag("Search") %>
  <% end %>

我已使用以下代码将matches.html.erb添加到matches文件夹中:

 <h1>Search Matches Catalog</h1>
 <br />
 <h3>Searching For: <%= @search_term %></h3>
 <table class="catalog">

 <% if @matches.length == 0  %>
 <br />
 <h2>No matches found for this search term!!</h2>
 <% end %>

 <% @matches.each do |match| %>
 <tr>
    <td><%= match.opponent %></td>
    <td><%= match.game %></td>
    <td><%= match.home_away %></td>
    <td><%= match.kick_off.strftime("%d/%m/%Y at %I:%M") %></td>
    <td><%= match.score %></td>
    <td><%= match.result %></td>

</tr>

<% end %>
</table>

<% if session[:login] == 1 %>
<p><%= link_to 'New match', new_match_path %></p>
<% end %>

这已添加到routes.rb文件中:

 post '/search' => 'matches#search'

最后,这已添加到application.html.erb文件中:

        <div class="searchbox">
        <%= render :partial => 'matches/search' %>
        </div>

我意识到这有点长篇大论,非常感谢任何建议。

如果有人如此封闭,我很乐意与他人分享我的cloud9开发环境,让他们看看他们是否觉得更容易。

提前致谢,我希望问题很明确。

1 个答案:

答案 0 :(得分:0)

我会建议elasticsearch,它有灵活的高级搜索索引,您可以在其中添加您想要搜索的列,满足您的要求。

一个很棒的elasticsearch客户端是searckick。它在elasticsearch DSL中抽象出所有困难并简化了你的使命。

首先,您需要安装elasticsearch,然后将gem 'searchkick'添加到Gemfile

如果您使用的是Mac brew install elasticsearch

对于Linux发行版,只需在brewapt-get或Fedora中的ubuntu中将yum替换为dnf

searchkick添加到您的模型

class Match < ActiveRecord::Base
  searchkick
end

要控制索引数据,请使用方法search_data

class Match < ActiveRecord::Base
  searchkick
  def search_data
    {
      opponents: opponents_data,
      details: details
    }
  end

  def opponents_data
    self.opponents.pluck(:name).join(',')
  end
end

之后运行Match.reindex,您可以使用Match.search("query")

在各自的文档中详细了解elasticsearchsearchkick。 (上面的链接)