株式会社エクストーン
下っ端
豊田陽一
  Elasticsearch
◦  概要
◦  セットアップ
  Tire
◦  Rubyで書かれたElasticsearchクライア
ント
  全文検索エンジン
◦  分散型
◦  RESTful
◦  Apache Luceneベース
  公式でrpm, debパッケージを配布
◦  http://www.elasticsearch.org/download/
◦  例) Ubuntuでのセットアップ
$ apt-get install openjdk-7-jdk
$ dpkg -i elasticsearch-0.90.1.deb
  HTTPで実行可能
◦  curlコマンドで一通りの操作が可能
◦  インデックス作成
$ curl –XPUT ‘localhost:9200/twitter’
◦  データの追加
$ curl –XPUT ‘localhost:9200/twitter/tweet’ –d ‘{
“user”: “rs_wisteria”,
“message”:”中二病、高二病と変遷し、加齢とともにたどり
着く先が成人病であるならば俺は一生中二病でいい。”
}’
  JSONで記述可能なDSLを利用する
◦  例) userがrs_wisteriaなデータを検索するクエリ
$ curl –XGET ‘localhost:9200/twitter/_search’ –d ‘{
“query” : {
“query_string” : {
“default_field” : “user”,
“query_string” : “rs_wisteria”
}
}
}’
  ここ読んで
◦  http://www.elasticsearch.org/guide/
reference/query-dsl/
  全文検索
  完全一致
  数値等の範囲検索
  日付
  位置検索
  その他いろいろ
  検索結果を指定されたカテゴリに分類する
$ curl -XGET 'localhost:9200/twitter/_search' -d '{
"facets" : {
"user" : {
"terms" : { "field" : "user" }
}
}
}'
  絞り込みの条件を指定する
◦  Queryとの違いは、Facetに影響があるか
どうか
  ソート
  サジェスト
  キーワードハイライト
  スクリプトフィールド
  .etc
  RubyからElasticsearchを操作するた
めのライブラリ
◦  ActiveRecordに組み込むことも出来る
  Ruby on Railsで利用する場合
◦  Gemfileに以下を追加し、bundle install
を実行
gem 'tire', :git => 'https://github.com/karmi/tire.git'
class Tweet < ActiveRecord::Base
include Tire::Model::Search
include Tire::Model::Callbacks
settings :number_of_shards => 1,
:number_of_replicas => 1 do
mapping {
indexes :user, :type => ‘string’
indexes :message, :type => ‘string’
}
end
end
  rake tire:import:model
◦  既にDBにデータがある場合、rakeのタス
クでElasticsearchにデータのインポート
が出来る
  以下のコマンドでmapping定義を作成し、
データの投入を行う
$ bundle exec rake tire:import:model CLASS=‘twitter’
FORCE=true
  Tire.search
◦  DSLに比較的似た文法で記述できる
search = Tire.search ‘twitter’ do
query {
string “user:rs_wisteria”
},
from 0
size 10
end
search.results.each do |tweet|
# 処理
end
  何か知らないうちに勝手にクラスタ構
造になってる
◦  クラスタ名が同じだと、同じネットワー
ク内のサーバを見つけ、自動的にクラス
タ構造を構築してくれる。
◦  /etc/elasticsearch/elasticsearch.yml
でクラスタ名を設定可能
◦  デフォルトで設定されてないので、ここ
を設定しないと、意図しないクラスタが
作られる
  Ngram検索が上手く動かない
◦  「かわいい」で検索すると「かorわorい
orい」みたいなクエリになってた
  ngramの最低のnが1になってた
  クエリ側で明示的にandになるように指定する
必要がある
  「かわ and わい and いい」みたいな
  その上で1文字のクエリに対応する必要がある
  今回は分かち書きのプラグイン(kuromoji)を導入し、
そちらのインデックスも生成することで1文字クエリ
に対応した
{
"items" : {
"settings" : {
"index.analysis.analyzer.kuromoji_analyzer.tokenizer" : "kuromoji_tokenizer",
"index.analysis.tokenizer.ngram.min_gram" : "2",
"index.number_of_replicas" : "1",
"index.analysis.tokenizer.ngram.max_gram" : "3",
"index.analysis.analyzer.ngram_analyzer.tokenizer" : "ngram",
"index.analysis.analyzer.kuromoji_analyzer.type" : "custom",
"index.analysis.analyzer.ngram_analyzer.type" : "custom",
"index.number_of_shards" : "1",
"index.analysis.tokenizer.ngram.type" : "nGram",
"index.version.created" : "900099"
}
}
}
  query_stringのdefault_operatorを
設定する
{
“query” : {
“query_string” : {
“default_field” : “message”,
“query” : “検索文字列”,
“default_operator” : “AND”
}
}
}
  elasticsearch
◦  インストール楽
◦  スケールアウトも楽
◦  データの挿入も楽
◦  検索はDSLで結構つまづく
  Tire
◦  既存のmodelに追加で導入するのがとて
も楽
◦  検索DSLも多少記述しやすい
  本家ドキュメントの対応で少し悩む

Elastic searchをrailsから使ってみた