블로그에 검색기능 추가하기

www.ruby-toolbox.com을 검색하면 위의 캡쳐화면에서와 같이 Sunspot을 가장 많이 사용하고 있다. 거의 같은 빈도로 많이 사용하는 SunspotRails 젬은 SunspotAcitveRecord와 연계해서 사용할 수 있도록 해 준다.

최근 인기를 얻고 있는 Elasticsearch도 추천할만 하지만 Sunspot과 함께 한글 검색시 형태소별로 검색이 되는 않는 문제점이 있다. 이것에 대해서 각자 해결해 보도록 하자. 이에 대한 참고문서를 아래에 링크해 두었다.

여기서는 SearchCop이라는 젬을 사용하여 검색기능을 구현해 보기로 한다.

1번 위치에 검색창을 붙이도록 하자.

이를 위해서 우선 Gemfile을 열고 아래와 같이 젬을 추가하고,

gem 'search_cop'

번들 인스톨한다.

$ bin/bundle install

Post 모델 파일을 열고 아래와 같이 검색을 위한 모듈을 추가하고 검색할 속성을 지정한다.

class Post < ActiveRecord::Base ... include SearchCop search_scope :search do attributes :title, :content attributes :comment => "comments.body" end ... end

posts#index 액션에 검색기능을 추가하기 위해서 app/controllers/posts_controller.rb 파일을 열고 아래와 같이 변경한다.

... def index if params[:search] @posts = Post.search(params[:search]) else if @category @posts = @category.posts.published_posts else if params[:category_id] == '0' @posts = Post.uncategorized_posts else @posts = Post.published_posts @posts = @posts.tagged_with(params[:tag]) if params[:tag] end end @category_name = params[:category_id] == '0' ? "Uncategorized" : (@category ? @category.name : "") end end ...

그리고 app/views/layouts/general_layout.html.erb 파일을 열고 해당 위치에 아래와 같이 검색을 위한 파셜을 추가한다.

... <div class='medium-3 columns' style="margin-top: 1em"> <%= render "layouts/search" %> <div class='row'> <div class='medium-12 columns'> <% if user_signed_in? %> <p><%= link_to "My Posts <small>( #{Post.myposts(current_user).size} )</small>".html_safe, list_my_posts_path %></p> <% end %> ...

그리고 app/views/layouts/_search.html.erb 파셜 파일을 생성하고 아래와 같이 추가한다.

<%= form_tag posts_path, :method => :get do %> <div class="row"> <div class="large-12 columns"> <div class="row collapse"> <div class="small-10 columns"> <%= text_field_tag :search, params[:search], placeholder: "search" %> </div> <div class="small-2 columns"> <%= button_tag icon('magnifying-glass'), class: "button secondary postfix" %> </div> </div> </div> </div> <% end %>

이제 로컬 서버를 다시 실행하고 브라우저에서 확인한다.

지금까지 작업한 내용을 로컬 저장소로 커밋한다.

$ git add . $ git commit -m "제10장 : 블로그에 검색기능 추가하기" $ git tag "제10장"


소스보기 https://github.com/luciuschoi/foundblog_app/tree/제10장


References:

  1. Railscasts : Search with Sunspot
  2. Railscasts : Elasticsearch Part 1
  3. Railscasts : Elasticsearch Part 2
  4. AttrSearchable : Search-engine like fulltext query support for ActiveRecord
  5. sunspot 한글 색인 가능하게 하기
  6. Sunspot과 Lucene을 이용한 풀 텍스트 검색엔진 구축하기