Rails에서 'Chewy'를 사용하여 쉽게 검색 기능 구현
16586 단어 chewyElasticsearchRails
소개
Chewy은 Rails 모델을 Elasticsearch에서 처리하는 Gem 중 하나입니다.
Chewy의 일본어 기사가 매우 적기 때문에, 이번 기사를 써 보려고 생각했습니다.
이 기사에서는 Chewy를 사용하여 우선 간단한 검색을 할 수 있을 때까지의 흐름을 정리해 보았습니다.
우선 움직이는 것을 목적으로 하고 있으므로 세세한 해설은 행하고 있지 않습니다만,
앞으로 조금씩 정리해 나가면 좋겠다고 생각합니다.
목표
「타이틀, 저자명, 출판사명으로부터 서적을 검색한다」라고 하는 심플한 검색을 Chewy로 구현한다.
환경
루비 2.5.3
rails 6.0.0
chewy 0.8.3
Elasticsearch 6.5.4
환경 구축
1. Dockerfile, docker-compose.yml 등을 작성한다.
chewy_sample
┣ docker
┃ ┣ es
┃ ┃ ┗ Dockerfile
┃ ┗ mysql
┃ ┃ ┣ Dockerfile
┃ ┃ ┗ my.cnf
┣ Dockerfile
┗ docker-compose.yml
./Dockerfile
FROM ruby:2.5.3-stretch
ENV BUNDLE_GEMFILE=/app/Gemfile \
BUNDLE_JOBS=2 \
RAILS_ENV=development \
LANG=C.UTF-8
RUN apt-get update -qq
RUN apt-get install -y build-essential
RUN apt-get install -y libpq-dev
RUN apt-get install -y nodejs
# ワーキングディレクトリの設定
RUN mkdir /app
WORKDIR /app
./docker-compose.yml
version: "3"
services:
es:
build: ./docker/es
container_name: es
environment:
- cluster.name=rails-sample-cluster
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- chewy_sample_data:/usr/share/elasticsearch/data
ports:
- 9200:9200
kibana:
image: docker.elastic.co/kibana/kibana:6.5.4
environment:
SERVER_NAME: localhost:5601
ELASTICSEARCH_URL: http://chewy_sample:9200
ports:
- 5601:5601
depends_on:
- es
db:
environment:
- MYSQL_ROOT_PASSWORD=docker
- MYSQL_PASSWORD=docker
- MYSQL_USER=docker
- MYSQL_DATABASE=chewy_sample
build: ./docker/mysql
ports:
- "3306:3306"
rails:
build: .
volumes:
- .:/app
- vendor_bundle:/user/local/bundle
ports:
- "3003:3000"
links:
- db
- es
environment:
- RAILS_DATABASE_USERNAME=root
- RAILS_DATABASE_PASSWORD=docker
- RAILS_DATABASE_NAME=rails_chewy_sample
- RAILS_DATABASE_HOST=db
tty: true
stdin_open: true
volumes:
chewy_sample_data:
driver: local
vendor_bundle:
driver: local
./es/Dockerfile
FROM docker.elastic.co/elasticsearch/elasticsearch:6.5.4
# elasticsearchで日本語を扱うために、kuromojiプラグインを導入
RUN bin/elasticsearch-plugin install analysis-kuromoji
./mysql/Dockerfile
FROM mysql:5.7
RUN touch /var/log/mysql/mysqld.log # 指定の場所にログを記録するファイルを作る
my.cnf
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
default-character-set=utf8
[mysqld_safe]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
explicit_defaults_for_timestamp
character-set-server=utf8
expire_logs_days = 2
default-time-zone = '+9:00'
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address = 127.0.0.1
#log-error = /var/log/mysql/error.log
# Recommended in standard MySQL setup
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
2. rails 프로젝트 만들기
$ docker-compose up -d
# Nameの確認
$ docker ps
# docker ps で確認したNameでrailsのコンテナに入る
$ docker exec -it chewy_sample_rails_1 /bin/bash
컨테이너 내에서 다음을 수행합니다.
/app# bundle init
Gemfile이 생성되므로 아래와 같이 편집
Gemfile
# frozen_string_literal: true
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
# コメントアウトを外す
gem "rails"
Gemfile 편집 후 컨테이너에서 다음 명령을 실행합니다.
# railsのコンテナ内
/app# bundle install
/app# bundle exec rails new .
3. 이번에 사용할 Gem 추가
Gemfile에 다음 줄 추가
Gemfile
# mysql2を追加
gem 'mysql2'
# chewyを追加
gem 'chewy', '~> 0.8.3'
# fakerを追加
gem 'faker'
app# bundle install
4. 시작
app# rails s -p 3000 -b '0.0.0.0'
여기까지 할 수 있으면, http://localhost:3000/ 에 제대로 동작하고 있는지 액세스해 확인해 봅니다.
익숙한 화면이 나타나면 OK
Rails 일본어
필요 없을지도 모르지만, Rails의 일본어화 대응을 실시합니다.
아래의 기사를 참고로 Rails의 일본어화를 했습니다.
[초학자]Rails의 i18n에 의한 일본어화 대응
또, faker의 일본어화를 실시합니다.
ko.yml을 다운로드하여 lib/locales/ko.yml에 놓습니다.
모델 만들기
책과 저자 및 출판사의 데이터를 저장하는 테이블을 준비합니다.
$ rails g model Book title:string author_id:integer publisher_id:integer price:integer
$ rails g model Author name:string
$ rails g model Publisher name:string
app/models/author.rb
class Author < ApplicationRecord
has_many :books
end
app/models/book.rb
class Book < ApplicationRecord
belongs_to :author
belongs_to :publisher
end
app/models/publisher.rb
class Publisher < ApplicationRecord
has_many :books
end
$ rails db:migrate
Chewy 설정
Chewy 설정 파일 만들기
config/chewy.yml 생성
$ rails g chewy:install
config/chewy.yml
# config/chewy.yml
# separate environment configs
test:
host: "es:9250"
prefix: "test"
development:
host: "es:9200"
색인 만들기
색인을 만듭니다.
이번에는 책 제목, 저자 이름, 출판사 이름으로 검색
$ mkdir app/chewy
$ touch app/chewy/books_index.rb
app/chewy/books_index.rb
class BooksIndex < Chewy::Index
define_type Book do
field :title, type: 'text'
field :author, type: 'text', value: ->(book) { book.author.name }
field :publisher, type: 'text', value: ->(book) { book.publisher.name }
end
end
테스트 데이터 작성
검색할 수 있는지 테스트하려면 Faker를 사용하여 테스트 데이터를 만듭니다.
Faker의 로케일의 관계로 저자명만이 일본인명이라고 하는 이상한 데이터가 되어 버립니다만, 애교라고 하는 것으로…
Chewy.strategy를 사용하면 데이터 생성 및 업데이트 업데이트에 따라 인덱스도 생성 및 업데이트됩니다.
db/seedsrb
Chewy.strategy(:atomic) do
50.times do |i|
Author.create(
name: Faker::Book.author
)
Publisher.create(
name: Faker::Book.publisher
)
Book.create(
title: Faker::Book.title,
author_id: i+1,
publisher_id: i+1,
price: 450,
)
end
end
$ rails db:seed
만약 어떠한 버그로, 데이터와 인덱스에 차이가 생겼을 경우, 이하의 커멘드로 인덱스의 리셋을 할 수 있습니다.
$ rails chewy:reset
색인 작성을 마치면 검색을 수행할 준비가 완료됩니다.
검색해보기
검색할 준비가 되었습니다.
rails console을 열고 책을 검색해 보세요.
# 本のタイトルで検索
> result = BooksIndex.query(match: {title: '<検索したい文字列>'})
> result.to_a
# 著者名で検索
> result = BooksIndex.query(match: {author: '<検索したい文字列>'})
> result.to_a
# 出版社で検索
> result = BooksIndex.query(match: {publisher: '<検索したい文字列>'})
> result.to_a
끝에
우선 검색을 할 수 있게 되었습니다.
세세한 해설은 앞으로 조금씩 올려가겠습니다.
자신 자신 아직 모르는 곳도 많이 있으므로 잘못되어있는 점 등 많이 있다고 생각합니다만, 지적하실 수 있으면 다행입니다.
참고한 기사
htps : // 기주 b. 이 m / 및 p l / chi wy # in s tat chion
htps : // 코 m / 야마 슌 / ms / 6 에카 6f161b4cf283db3
Reference
이 문제에 관하여(Rails에서 'Chewy'를 사용하여 쉽게 검색 기능 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/m-otsuka/items/a7e3a0e1cd50f3f8cc25텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)