ShakeJ
MNWorld
ShakeJ
전체 방문자
4,222,325
오늘
26
어제
103
  • 카테고리
    • Contact
    • 🤔그냥이야기
    • 📷사진이야기
    • 제주도에서 한달..
    • 옛글
      • 👇Blog
      • 공지사항
      • 이슈
      • 생각들
      • 👇취미
      • 건프라
      • 👇Review
      • 노래리뷰
      • 영화리뷰
      • 👇Travel Story
      • 2011 도쿄여행기
      • 2013 Google IO
      • 2013 Jeju
      • 2014 HONGKONG
      • 2014 Jeju
      • 2014 Sanfransisco
      • 2015 Lombok
      • 2016 HONGKONG
      • 2017 Saigon
      • 국내여행기
      • Photo Story
      • Growth
      • 👇Server
      • Ruby on the Rails
      • Frontend
      • FullStack (MEAN)
      • Ubuntu
      • 👇Android
      • 안드로이드 프로..
      • 번역본
      • 내어플이야기
      • 코드창고
      • 👇iOS
      • 아이폰 프로그래밍
      • 맥북 이야기
      • 👇Microsoft
      • ASP.NET
      • Silverlight
      • 윈도우 이야기
      • 👇IT Story
      • 모바일 이야기
      • 하드웨어 이야기
      • 네트워크 이야기
      • 프로그래밍이야기
      • Database이야기
      • 클라우드이야기
      • 프론트 이야기
      • 마케팅이야기
      • 그래픽 작업
      • 블로그 팁

블로그 메뉴

  • GuestBook

공지사항

인기 글

  • [서울 출사지] 남양주 폐공장과⋯
    2017.03.20
    [서울 출사지] 남양주 폐공장과⋯
  • 소니 노이즈캔슬링 이어폰 MDR-⋯
    2017.03.14
    소니 노이즈캔슬링 이어폰 MDR-⋯
  • 로지텍 M331 무소음 빨간 무선⋯
    2017.04.07
    로지텍 M331 무소음 빨간 무선⋯
  • [Ruby on rails] ElasticSearch⋯
    2017.04.14
    [Ruby on rails] ElasticSearch⋯
  • Rails 구글 크롬 노티피케이션(⋯
    2017.10.13
    Rails 구글 크롬 노티피케이션(⋯

태그

  • 티스토리 초대장
  • 블로그 운영하기
  • 티스토리 팁
  • 블로그 이야기
  • 블로그 꾸미기
  • 블로그 관련
  • D40 사진
  • 블로그 처음
  • 블로그 시작하기
  • 서울 출사지
  • 블로그 초보
  • 블로그 운영
  • 초대장
  • 배너교환
  • 안드로이드 어플 추천
  • shakej
  • iOS 프로그래밍
  • MNWorld
  • 무료배너제작
  • 블로그 잡담
  • 블로그 운영하면서
  • 블로그 만들기
  • 랩
  • 배너무료제작
  • 티스토리
  • 풍경사진
  • 윈도우폰7
  • 배너제작
  • 블로그 팁
  • asp.net

최근 댓글

  • 감사합니다~!
    ShakeJ
  • 포스팅 잘봤습니다 공감 누르고⋯
    hellorly
  • 감사합니다 😄
    ShakeJ
  • 포스팅 잘봐서 좋아요 눌렀어요⋯
    D
  • 앗 옛날에 쓴 그 게임 디스크⋯
    ShakeJ

최근 글

  • [제주도에서 한달을 살아보았다⋯
    2022.06.14
    [제주도에서 한달을 살아보았다⋯
  • [📷사진이야기] 붉은 호치민의⋯
    2022.02.10
    [📷사진이야기] 붉은 호치민의⋯
  • 13년간의 블로그, 오랫만의 글⋯
    2022.02.09
    13년간의 블로그, 오랫만의 글⋯
  • DB의 index와 rails가 기억하는⋯
    2020.10.22
  • 건프라 삼국창걸전 SD를 세울⋯
    2020.09.29
    건프라 삼국창걸전 SD를 세울⋯

티스토리

hELLO · Designed By 정상우.
ShakeJ

MNWorld

[Ruby on rails] ElasticSearch 를 붙여보자
옛글/Ruby on the Rails

[Ruby on rails] ElasticSearch 를 붙여보자

2017. 4. 14. 12:18

검색을 위한 ElasticSearch를 Rails에 붙여봅시다. 


ElasticSearch이 무엇이며 왜 사용해야 하는지부터 알아봅시다. 

(https://www.elastic.co)


! 설치와 실행이 간편하다

! ElasticSearch는 Java기반으로 빠른 검색이 가능하다.

! Lucene Libarary를 사용하여 Restful 방식으로 검색이 가능하다 

! CSV, XML, JSON 등 다양한 포맷을 지원한다. 

! Multi-tenancy 를 지원하여 여러개의 Index에 한번에 질의가 가능하다.


한 마디로 검증이 되어 있는 검색엔진이기에 서비스에 "검색"을 붙일 때 해당 엔진을 사용하여 좀 더 빠르고 쉽게 검색이 가능하다는 장점이 있습니다. 

데이터베이스에 직접적으로 쿼리로 검색을 하는 것이 아닌, ElasticSearch엔진에서 Indexing을 하고 있다가 검색에 대한 결과를 제공하기 때문에 데이터베이스의 부담은 낮아지게 됩니다. (물론 엔진이 도는 서버 리소스의 부담은 있지만)


ElasticSearch 알고리즘은 아래 Speaker Deck을 참고하시기 바랍니다. 




자 ubuntu에 설치를 해봅시다. (AWS / Azure 에서 RDS형태로도 제공을 해줍니다)


sudo add-apt-repository -y ppa:webupd8team/java

sudo apt-get update

sudo apt-get -y install oracle-java8-installer

java -version

wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-2.2.0.deb

sudo dpkg -i elasticsearch-2.2.0.deb

service elasticsearch start


이렇게 설치 후 실행을 시키면, Rails model에 ElasticSearch를 사용하기 위해 적힌 모델들에 대해서 Indexing을 하게 됩니다.

모델 클래스를 수정해봅시다.


Gemfile


gem 'elasticsearch-model', git: 'git://github.com/elasticsearch/elasticsearch-rails.git' gem 'elasticsearch-rails', git: 'git://github.com/elasticsearch/elasticsearch-rails.git'


Message.rb (Model)


class Message < ApplicationRecord

  include Elasticsearch::Model

  include Elasticsearch::Model::Callbacks

end

Message.import force: true


이제 ElasticSearch를 재 실행하게 되면, 


알아서 맵핑을 하게 됩니다.


간단하게 쿼리를 날려 검색을 해보겠습니다.


Message.rb


def self.search(query, chat_ids)

    search_definition =

    {

      query: {

        bool: { filter: {

                 terms: {

                   "chat_id": chat_ids,

                 },

              },

              must: {

                  multi_match: {

                    "query": query,

                    "type": "phrase_prefix",

                    "fields": [ "body" ],

                    }

                  }

              },

      }

    }

    __elasticsearch__.search(search_definition)

  end


검색을 할 때 query가 body 컬럼에 필수로 포함되어 있어야 하며, 특정 채팅방 id들 안에서만 필터링하여 검색을 하라라고 구현을 했습니다.

메세지들을 검색할 때에는 Message.search("TEST", chat_ids)로 해당 메서드를 호출하면 ElasticSearch에서 결과를 리턴해줍니다.



데이터베이스에서 쿼리를 던지면 나오는 Relation과는 다르게 ElasticSearch의 모델로 결과가 튀어나오게 됩니다. 


결과를 가져오기 위해서는,


search_result = Message.search("Test", chat_ids)

result = search_result.result.to_a


로 사용을 하면, 검색 결과로 나온 Message 모델들의 Array 형태로 사용이 가능합니다. 


기본적인 설치법과 사용법입니다. 혹시라도 추후에 추가적인 기능적인 사용이나 이슈가 있으면 한 번 더 공유하겠습니다 :) 



저작자표시비영리변경금지
  • 카카오스토리
  • 트위터
  • 페이스북

'옛글 > Ruby on the Rails' 카테고리의 다른 글

Mac Postgres install and command  (0) 2019.03.27
Rails 구글 크롬 노티피케이션(푸쉬) FCM(Firebase)로 붙이기  (0) 2017.10.13
[Ruby on rails] ElasticSearch 를 붙여보자  (0) 2017.04.14
[Ruby on rails] Sidekiq이 버벅거린다면, Rails sidekiq process 갯수 늘리기  (0) 2017.04.13
[Ruby on rails] 서버 속도 (+MYSQL)를 개선해보자!  (0) 2017.04.12
RVM to Rbenv  (0) 2016.01.08
    추천글👇
    • [📷사진이야기] 붉은 호치민의 노을
    elasticsearch, Rails ElasticSearch, Rails 검색, 검색엔진
    ShakeJ
    ShakeJ
    댓글쓰기
    다음 글
    Rails 구글 크롬 노티피케이션(푸쉬) FCM(Firebase)로 붙이기
    이전 글
    [Ruby on rails] Sidekiq이 버벅거린다면, Rails sidekiq process 갯수 늘리기
    • 이전
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • ···
    • 17
    • 다음

    티스토리툴바