elasticsearch入門 pyfes 201207

41
@johtani

Upload: jun-ohtani

Post on 14-Jun-2015

21.280 views

Category:

Technology


2 download

DESCRIPTION

I'm learning elasticsearch now. This slide is old, new version is here. -> http://blog.johtani.info/blog/2013/08/30/hold-first-elasticsearch-meetup-in-japan/

TRANSCRIPT

Page 1: Elasticsearch入門 pyfes 201207

@johtani  

Page 2: Elasticsearch入門 pyfes 201207

p 所属:㈱シーマーク  p 氏名:大谷 純  p  twitter:@johtani  p ブログ:  http://johtani.jugem.jp  

p 「Apache  Solr入門」   の著者の一人   まだ売ってるはず。  

p  lucene-­‐gosenのcommitter

Page 3: Elasticsearch入門 pyfes 201207

p  pyfes初参加(なぜか、家族イベントとかぶって参加できず)  

p  Javaがメインで、Pythonあんまりやらないです。すみません。  

p シールが欲しくてやってきました。  

Page 4: Elasticsearch入門 pyfes 201207

p 単語集  

p  elasticsearchって?  

p アーキテクチャ概要  

Page 5: Elasticsearch入門 pyfes 201207

p 単語集  

p  elasticsearchって?  

p アーキテクチャ概要  

Page 6: Elasticsearch入門 pyfes 201207

p 転置インデックス(inverted  index)と  shard  

p  analysisとtextとterm  

p  cluseterとnode  

p  documentとfield  

Page 7: Elasticsearch入門 pyfes 201207

p  analysisとtextとterm  p  text  

p 入力された文字列。文章  

p  analysis  p 入力された文字列を解析しtermという単位に分解する処理  p 例:N-­‐Gram、形態素解析、空白区切りなど  

p  term  p  textを解析した結果として出力される単語  p この単語を元に転置インデックスを作成  

Page 8: Elasticsearch入門 pyfes 201207

p 転置インデックス

カツオはサザエの弟  

サザエはワカメの姉

1

2

文章を単語に分割し、  単語:ドキュメントIDと整理

対象とする文章(ドキュメント)に  IDを付与

 

単語をキー、ドキュメントIDの  配列を値とする表を作成    =  転置インデックス

カツオ 1 は 1 サザエ 1 の 1 弟 1

サザエ 2 は 2 ワカメ 2 の 2 姉 2

カツオ 1

1

の 1

弟 1

サザエ 2

ワカメ 22

姉 2

1 2

Page 9: Elasticsearch入門 pyfes 201207

転置インデックス

検索クエリ

カツオ 1

1

の 1

弟 1

サザエ 2

ワカメ 2

2

姉 2

1 2 カツオ

サザエ

AND

検索結果

1  

 

p 転置インデックスの検索

Page 10: Elasticsearch入門 pyfes 201207

p  documentとfield    p  document  

p  LuceneでRDBのレコードに相当するものを意味する  p  documentが検索結果に出てくる1件分のデータ  

p  field  p  RDBのカラムに相当するもの  p  documentは複数のfieldから構成される  p 転置インデックスが作成される最小単位  p  fieldには、保存用(stored)とインデックス(indexed)がある。  

Page 11: Elasticsearch入門 pyfes 201207

p  indexとshard  p  index  

p  RDBのデータベースに相当する概念  p 複数のフィールドの転置インデックスから構成  

p  shard  p  Luceneの1つのインスタンスに相当  p 複数のshardを束ねて1つのインデックスとすることが可能  p レプリカされるインデックスの単位でもある

Page 12: Elasticsearch入門 pyfes 201207

p  clusterとnode  p  cluster  

p  1つ以上のnodeから構成されるnodeの集合  p  1つのマスターノードが自動で選出される。  p マスターノードが故障したら、別のものが選出される  p マスターノードの役割はクラスターの状態のメンテナンスやノードの追加、削除によりshardを再配置するときの動作

p  node  p  elasticsearchのインスタンス  p  node内部に複数のshardを保持できる

Page 13: Elasticsearch入門 pyfes 201207

Cluster

Node

Shard1  (Index2)

Shard0  (Index1)

Node

Shard1  (Index1)

Shard0  (Index2)

Page 14: Elasticsearch入門 pyfes 201207

p 単語集  

p  elasticsearchって?  

p アーキテクチャ概要  

Page 15: Elasticsearch入門 pyfes 201207

p 分散型でRESTfulな検索エンジン  

p  Open  Source  Software  p  Apache  Software  License  Version  2.0  

p  Apache  Luceneをベースに構築  

p スキーマフリー&ドキュメント指向  

p マルチテナント対応  

トレードマーク?

Page 16: Elasticsearch入門 pyfes 201207

p  JSONで設定、インデックス、検索が可能  p もちろん、設定ファイルによる設定も可能  p  URLでIndex名、データタイプを表現  p 例:設定(shardとreplicaの数を設定)  

$  curl  -­‐XPUT  http://localhost:9200/twitter/tweet/  -­‐d  '{          "settings"  :  {                  "number_of_shards"  :  2,                  "number_of_replicas"  :  3          }  }‘    インデックス毎に設定が可能。

Page 17: Elasticsearch入門 pyfes 201207

p インデックス(データ登録)  p 登録ももちろんJSONで  

$  curl  -­‐XPUT  'http://localhost:9200/twitter/tweet/1'  -­‐d  '{          "user"  :  “johtani",          "post_date"  :  "2012-­‐07-­‐15T14:12:12",          "message"  :  “I  talk  to  elasticsearch  at  #pyfes"  }‘    

フィールドは自動で型を判別して登録。  (もちろん指定も可能)  IDを自動で生成も可能(URLのIDを指定せずに登録すればOK)IDのハッシュ値でshardにルーティング(ID以外にパラメータで指定も可能)  

Index名 Type名 ID

Page 18: Elasticsearch入門 pyfes 201207

p 取得(GET)  curl  -­‐XGET  ‘http://localhost:9200/twitter/tweet/1’    curl  -­‐XGET  'http://localhost:9200/twitter/tweet/1?fields=user,message'    

データの取得。2つ目は取得するフィールドを指定してからの取得。  fieldsパラメータで取得できるのはstoredフィールドのみ  

p 削除(DELETE)  curl  -­‐XDELETE  'http://localhost:9200/twitter/tweet/1‘    curl  -­‐XDELETE  'http://localhost:9200/twitter/tweet/_query?q=user:johtani‘  

クエリによる削除も可能  

Page 19: Elasticsearch入門 pyfes 201207

p 検索(JSONベースの検索DSL)  

$  curl  -­‐XGET  ‘http://localhost:9200/twitter/tweet/_search’  -­‐d  ‘{          “query”:  {  "term"  :  {  "user"  :  “johtani"  }  }  }'  

 例:userフィールドをjohtaniで検索    

p 検索機能としては、以下をカバー  ファセット、絞り込み検索、ハイライト、Geo検索、  範囲検索、カスタムスコアなどなど  http://www.elasticsearch.org/guide/reference/query-­‐dsl/

Page 20: Elasticsearch入門 pyfes 201207

p ソースはGithubで公開  p  https://github.com/elasticsearch/elasticsearch  

p  Apache  Software  License  V2.0  

p 最新安定版は0.19.8(trunkが0.20.0)  

Page 21: Elasticsearch入門 pyfes 201207

p  Apache  Lucene  p  Javaで書かれた、転置インデックスのライブラリ  p ハイライト、Geo検索などいろいろと検索に関連する機能も充実  

p  elasticsearchの最新版では3.6.1を利用  p 利用モジュール  

p  analyzer、core、highlighter、memory、queries

Page 22: Elasticsearch入門 pyfes 201207

p  Document(JSON)で登録すると型を推測してインデックスに登録  

p もちろん、厳密に指定して登録も可能  p  Schema  Mapping  

$  curl  -­‐XPUT  'http://localhost:9200/twitter/tweet/_mapping'  -­‐d  ‘{          "tweet"  :  {                  "properties"  :  {                          "message"  :  {"type"  :  "string",  "store"  :  "yes"}                  }          }  }'

Page 23: Elasticsearch入門 pyfes 201207

p 複数のインデックスを保持  p  URLの一部にインデックス名を保持      $  curl  -­‐XPUT  http://localhost:9200/elasticsearch  

 

p 複数のインデックスに対する検索も可能  p インデックス名をカンマ区切りで指定すればOK  

$  curl  -­‐XGET  http://localhost:9200/twitter,elasticsearch/tweet/_search?q=message:elasticsearch

Index名

Page 24: Elasticsearch入門 pyfes 201207

p  Riverはelasticsearchクラスタにデータを流し込むプラガブルなサービス  

p プラグインという形で、elasticsearchに組み込み可能  p  CouchDB  p  RabbitMQ  p  Twitter  Stream  p  Wikipedia  

Page 25: Elasticsearch入門 pyfes 201207

p  JSON  over  HTTPが基本  p  Java、GroovyのAPIもある  p その他にClientsライブラリも存在  

p  http://www.elasticsearch.org/guide/appendix/clients.html  

p  pyes  –  Python  Client  p  Tire  –  Ruby  API&DSL,  with  Active  Record/ActiveModel  integration  

p  erlastic_search  –  Erlang  client  p その他にScala、.NET、PHPなどなど  

Page 26: Elasticsearch入門 pyfes 201207

p 様々なライブラリなどとの連携も  p  Grails  :  ElasticSearch  Grails  plugin  p  django-­‐elasticsearch  :  Django  ElasticSearch  Bachend  

p  Wonderdog  :  Hadoop  bulk  loader  into  elasticsearch  

p  elasticflume  :  Flume  sink  implementation  p  elasticsearch-­‐mocksolrplugin  :  Use  Solr  clients/tools  with  ElasticSearch  

Page 27: Elasticsearch入門 pyfes 201207

p ガイド(セットアップ、各種APIも)  p トップ  http://www.elasticsearch.org/guide/  

p 各種操作用API  http://www.elasticsearch.org/guide/reference/api/  

p 検索クエリDSL  http://www.elasticsearch.org/guide/reference/query-­‐dsl/  

Page 28: Elasticsearch入門 pyfes 201207

p 単語集  

p  elasticsearchって?  

p アーキテクチャ概要  

Page 29: Elasticsearch入門 pyfes 201207

Elasticsearch(Node)

ノード間通信 クライアント向けAPI

Index

HTTP Thrift memcached Transport

Network

Gateway

Cluster Indices Discovery

JMX

Thread  Pool

Scripting

Shard  Allocation  

Analysis  

Merge   Store  Translog  

Show  Log

Plugin

※妄想しながら書いてます

Page 30: Elasticsearch入門 pyfes 201207

p  HTTP  p  APIをHTTPで提供するモジュール  p  Nettyを利用したサービス  

p  memcached  p  APIをmemcachedプロトコルで提供するモジュール  p  transport-­‐memcachedプラグインが必要  

p  Thrift  p  APIをThriftで提供するモジュール  p  transport-­‐thriftモジュールが必要  

Page 31: Elasticsearch入門 pyfes 201207

p  Transport  p クラスタ内部のノード間通信モジュール  p  Nettyベースの通信  p 例:HTTP  GETリクエストを他のノードに転送  

p  JMX  p  JMXでノードの情報にアクセス可能にするモジュール  

p  Network  p  HTTPやTransportなどのネットワーク系のモジュールの設定を共通化するモジュール

Page 32: Elasticsearch入門 pyfes 201207

p  Thread  Pool  p ノードが持つスレッドプールの管理をするモジュール  

p 各処理用のプールを保持  p インデックス  p 検索  p バルク  p リフレッシュなどなど  

p  cache、fixed、blockingなどのタイプがある。  p  Fixed、blockingはキューのサイズなども指定可能  

Page 33: Elasticsearch入門 pyfes 201207

p  Plugin  p 各種プラグインを管理するモジュール  p プラグイン名は「elasticsearch-­‐」で始まる  p  Githubにあるプラグインをダウンロードしてインストールする機能もある  

p カスタムAnalyzer、カスタムDiscoveryなど  p  GUI用のプラグインも  https://github.com/mobz/elasticsearch-­‐head

Page 34: Elasticsearch入門 pyfes 201207

p  Cluster  p  Shardの割り当て処理(レプリカ、リバランス、リカバリ、追加削除など)を扱うモジュール  

p  Node  p ノードの挙動を設定するモジュール。  p 例:データを保持するノード、HTTP受付処理をするノードなどにすることが可能  

p  Discovery  p クラスタ内で、ノードを見つけるためのモジュール  (マスターノード選出とか)  

p  Zen、EC2、Zookeeperという種類がある

Page 35: Elasticsearch入門 pyfes 201207

p  Indices  p  Indexのバッファサイズなどの設定  p  Index生成など、Indexに関連する処理のモジュール  

p  Gateway  p クラスタメタデータとインデックスを保存する機能

p 保存先はLocal、Shared  FS、Hadoop、S3などあり

Page 36: Elasticsearch入門 pyfes 201207

p  Analysis  p インデックス、検索時に利用されるAnalyzerの設定など  

p  Mapper  p 型マッピング定義を扱うモジュール

p 入力データをどのAnalyzerを利用して解析するかなどを静的/動的に指定可能  

Page 37: Elasticsearch入門 pyfes 201207

p  Store  p インデックスの一時保存を扱うモジュール  

p 永続化はGatewayが行う  

p メモリ、ディスクが選択可能  p  Local  Gatewayを利用している場合はメモリを使わない  

p  Translog  p  Transaction  log/write  ahead  logを扱うモジュール  

p  Flushのタイミングなどを指定可能  

Page 38: Elasticsearch入門 pyfes 201207

p  Shard  Allocation  p インデックスの配置をコントロール  

p  Show  Log  p 遅い検索クエリをログ出力するモジュール  p しきい値など設定可能  

p  Cache  p インデックスに関連するキャッシュを管理  p 検索結果やフィールドの価をキャッシュ  

Page 39: Elasticsearch入門 pyfes 201207

p  HP  p  http://www.elasticsearch.org/  

p スライド  p  https://speakerdeck.com/u/kimchy/p/the-­‐road-­‐to-­‐a-­‐distributed-­‐search-­‐engine  

p  https://speakerdeck.com/u/kimchy/p/elasticsearch-­‐big-­‐data-­‐search-­‐analytics  

p  http://spinscale.github.com/elasticsearch/2012-­‐03-­‐jugm.html#/

Page 40: Elasticsearch入門 pyfes 201207

p ということで、まだまだ入門中です。  

p 一緒に勉強してくれる人、募集中です。  

p  @johtaniまで@ツイートお願いします

Page 41: Elasticsearch入門 pyfes 201207

p  guava  -­‐  Googleが公開しているJava用こらライブラリ。collection周り、キャッシュを主に利用

p  trove  -­‐  プリミティブ型に関するコレクションライブラリ p  joda-­‐time  -­‐  日付用ライブラリ p  mvel2  -­‐  スクリプトエンジン。スクリプトモジュールで利用 p  jackson  -­‐  JSONライブラリ p  snakeyaml  -­‐  YAMLライブラリ p  netty  -­‐  軽量通信ライブラリ? p  log4j  -­‐  Logライブラリ p  slf4j  -­‐  Logライブラリ p  jna  -­‐    p  sigar  -­‐  The  Sigar  API  provides  a  portable  interface  for  gathering  system  

information.モニタリング用 p  testng  -­‐    p  junit  -­‐  Unitテスト用ライブラリ p  bsh  -­‐    p  jcommander  -­‐    p  hamcrest  -­‐