Elasticsearchプラグインの作り方
-
Upload
shinsuke-sugaya -
Category
Engineering
-
view
4.062 -
download
1
description
Transcript of Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方 ~ CodeLibsの便利なプラグイン紹介
第7回Elasticsearch勉強会
第7回Elasticsearch勉強会
名前: 菅谷信介 所属: N2SM, Inc. (http://www.n2sm.net/) オープンソース活動:
Apache Portals コミッタ Seasarプロジェクトコミッタ CodeLibsプロジェクト運営 (https://github.com/codelibs) などなど・・・
Github: https://github.com/codelibs Blog: http://www.chazine.com/ Twitter: https://twitter.com/shinsuke_sugaya/
自己紹介
2
第7回Elasticsearch勉強会
アジェンダ
Elasticsearchプラグインとは プラグインの作り方 CodeLibsのプラグイン紹介 まとめ
3
第7回Elasticsearch勉強会
Elasticsearchプラグインとは
4
第7回Elasticsearch勉強会
Elasticsearchの機能を拡張する仕組み pluginコマンドにより簡単にインストール プラグインは2種類ある ネイティブなプラグイン (今日は主にコレ)
Elasticsearchの機能自体を変更・拡張する
サイトプラグイン HeadやkopfのようにHTMLでの情報提供系
ネイティブなプラグインはJavaで作り、jarファイルをzipでまとめたもの
Elasticsearchプラグインとは
5
第7回Elasticsearch勉強会
プラグインの作り方
6
第7回Elasticsearch勉強会
必要なもの Java 7以上 Maven
以下のコマンド実行でプロジェクトが完成! $ mvn archetype:generate ¥ -DarchetypeGroupId=org.codelibs ¥ -DarchetypeArtifactId=elasticsearch-plugin-archetype ¥ -DarchetypeVersion=1.4.0 ¥ -DelasticsearchVersion=1.4.0 ¥ -DgroupId=com.yourplugin ¥ -DartifactId=elasticsearch-yourplugin ¥ -Dversion=1.0-SNAPSHOT ¥ -DpluginName=YourPlugin
プラグインプロジェクトの作成
赤字部分を変更する
7
第7回Elasticsearch勉強会
プラグインのzipファイルを生成 $ mvn package (target/releasesディレクトリ以下に生成される)
プラグインのインストール $ $ES_HOME/bin/plugin –i yourplugin -u file:/path/elasticsearch-yourplugin.zip
あとはElasticsearchを再起動すればOK!
プラグインの生成
8
第7回Elasticsearch勉強会
という感じで、 Elasticsearchプラグインは
簡単に作って インストールできます
9
第7回Elasticsearch勉強会
もう少し プラグインの作り方の
説明します…
10
第7回Elasticsearch勉強会
Elasticsearchプラグインを作成するためのMaven Archetype ブランクプロジェクト(ひな形)が作成できる
コマンド一つでプロジェクトが作成可能 Elasticsearch 1.xごとにArchetypeは提供 Elasticsearchがマイナーバージョンアップで I/Fが変わるため、作り直している…
シンプルなプロジェクトが作成されるので、必要なものを追加や削除すれば、簡単にElasticsearchのプラグインができます!
Elasticsearch Plugin Archetype https://github.com/codelibs/elasticsearch-plugin-archetype
11
第7回Elasticsearch勉強会
プロジェクト設定ファイル pom.xml
プラグイン情報ファイル src/main/resources/es-plugin.properties
プラグインのベースとなるソース src/main/java/com/yourplugin/YourPluginPlugin.java
REST用ソース src/main/java/com/yourplugin/rest/YourPluginRestAction.java
サービス用ソース src/main/java/com/yourplugin/module/YourPluginModule.java src/main/java/com/yourplugin/service/YourPluginService.java
River用ソース src/main/java/com/yourplugin/module/YourPluginRiverModule.java src/main/java/com/yourplugin/river/YourPluginRiver.java
プラグイン生成情報のファイル src/main/assemblies/plugin.xml
Archetypeの生成物
12
第7回Elasticsearch勉強会
public class YourPluginRestAction extends BaseRestHandler { @Inject public YourPluginRestAction(final Settings settings, final Client client, final RestController controller) { super(settings, controller, client); controller.registerHandler(RestRequest.Method.GET, "/{index}/{type}/_hello", this); controller.registerHandler(RestRequest.Method.GET, "/{index}/_hello", this); }
例:REST APIを拡張 (その1)
13
受け付けるHTTPメソッドやパスを指定する
第7回Elasticsearch勉強会
@Override protected void handleRequest(final RestRequest request, final RestChannel channel, Client client) { try { final XContentBuilder builder = JsonXContent.contentBuilder(); builder.startObject(); builder.field("index", request.param("index")); builder.field("type", request.param("type")); builder.field("description", "This is a elasticsearch-yourplugin response: " + new Date().toString()); builder.endObject(); channel.sendResponse(new BytesRestResponse(OK, builder)); } catch (final IOException e) { try { channel.sendResponse(new BytesRestResponse(channel, e)); } catch (final IOException e1) { logger.error("Failed to send a failure response.", e1); } } }
例:REST APIを拡張 (その2)
14
返却するJSONをこの辺に記述する
第7回Elasticsearch勉強会
CodeLibsプラグインの紹介
15
第7回Elasticsearch勉強会
ウェブサイトをクロールして、ページをインデックス化する (サイト内検索にも利用可) 全文検索サーバFessと同じクローラー
CSSクエリーによるウェブスクレイピング スクリプトにより編集して登録 クロール開始時間をスケジュール BASIC/DIGEST/NTLM認証に対応 attachmentタイプもサポート
Elasticsearch River Web https://github.com/codelibs/elasticsearch-river-web
16
第7回Elasticsearch勉強会
SolrのI/FでElasticsearchにアクセス Mock Solrプラグインがメンテされていないのでフォークして提供
検索・更新に対応 Geoサーチにはまだ未対応
Solr形式のXML/JavaBinフォーマットに対応 SolrJ等でSolrのツールが利用可能 利用例 Solr環境からの移行
Elasticsearch Solr API https://github.com/codelibs/elasticsearch-solr-api
17
第7回Elasticsearch勉強会
Mahout Tasteをベースのリコメンド機能 利用者/商品/嗜好データ管理 情報をインデックスで管理
利用者/商品ベースのリコメンド 類似利用者の算出 テキスト分析 (商品情報のタームベクターの生成等)
「利用者/商品/嗜好→ドキュメント/ターム/出現数」として、協調フィルタリングによるドキュメントのリコメンド
Elasticsearch Taste https://github.com/codelibs/elasticsearch-taste
18
第7回Elasticsearch勉強会
生成済みのインデックスをコピーして、 新しいインデックスを作成する _sourceからデータをスクロールスキャンして、インデックスを生成
簡単にインデックスをコピー可能 利用例 テスト等で既存インデックスから、Analyzerやマッピングが異なるインデックスを作成する
今後:他のクラスターに対しても再インデクシングを可能にしたい
Elasticsearch Reindexing https://github.com/codelibs/elasticsearch-reindexing
19
第7回Elasticsearch勉強会
Excel/CSV/バルクJSON形式でデータをダンプする Excelでダンプできる!
…/_searchの代わりに…/_dataを指定する 利用例 Excel好きな人に結果を渡す バルクJSON形式で部分抽出をして、別インデックスにバルク投入して利用(全データが必要 ない場合とか)
今後:内部ロジックでレスポンスの返却の仕方を改善
Elasticsearch Data Format https://github.com/codelibs/elasticsearch-dataformat
20
第7回Elasticsearch勉強会
スクリプトを利用したクエリーテンプレート 任意のスクリプト言語でクエリーを組み立てる
(標準のmustacheは穴埋め的なクエリー作成が可能だがそれでは物足りない人向け)
標準のクエリーテンプレートとほぼ同じ langを指定する追加する
パラメータ書き換えのためのフィルタ機能 利用例 パラメータによりクエリーを変更する A/Bテスト
https://github.com/codelibs/elasticsearch-sstmpl
Elasticsearch Script-based Search Template
21
第7回Elasticsearch勉強会
クエリー例 GET /_search/template { "lang": "groovy", "template": "'{¥"query¥": {¥"match¥": {¥"title¥": ¥"' + query_string + '¥"}}}'", "params": { "query_string": "search for these words" } }
langでtemplateのスクリプト言語を指定 利用したいスクリプト言語は追加しておく
https://github.com/codelibs/elasticsearch-sstmpl
Elasticsearch SSTmplの例
22
第7回Elasticsearch勉強会
Handlebarsをスクリプト言語としてElasticsearchに追加する
クエリーテンプレートで標準のmustacheでできなかった、ロジックが書ける
HandlebarsのHelperもjsファイルで記述することが可能
Elasticsearch Handlebars Lang https://github.com/codelibs/elasticsearch-lang-handlebars
23
第7回Elasticsearch勉強会
Velocityをスクリプト言語としてElasticsearchに追加する
クエリーテンプレートでVelocityが利用可能 Dynamic Scriptingを有効にする
script.disable_dynamic: false
Elasticsearch Velocity Lang https://github.com/codelibs/elasticsearch-lang-velocity
24
第7回Elasticsearch勉強会
インデクシング時に指定されたフィールドの単語に対するb-bit MinHashを計算・保存 簡単にいうと、MinHashは高速に2つのデータを比較する方法 (文書も指定したビット列に変換され、それだけを比較することで一致を判断)
プラグインでバイトフィールドに格納 0/1のビットの文字列でも格納可能
利用例 類似文書の検索 高速に類似ドキュメントを計算
Elasticsearch MinHash https://github.com/codelibs/elasticsearch-minhash
25
第7回Elasticsearch勉強会
検索結果の上位N件を並び替える 並び替えはスクリプト言語で記述する 標準のRescoringはシャード単位だが、
DynaRankはマージされた結果に対して 並び替えを行う
N+1番目以降は通常の検索結果と同様 インデックス設定を変更することで、動的に 有効・無効にすることができる
利用例 特定の内容は上位に表示する 検索結果の重複をなくす
Elasticsearch DynaRank https://github.com/codelibs/elasticsearch-dynarank
26
第7回Elasticsearch勉強会
検索結果をキャッシュする Solrでいうと、Query Result Cacheのこと
(QRコードのキャッシュではないです…)
インデックスがあまり更新されないようなケースで有効 リアルタイムとは逆行するがインデックスの 種類によっては更新頻度が低いものもある
キャッシュは保存量、期限、Refreshの呼び出しにより、クリア可能
Elasticsearch QRCache https://github.com/codelibs/elasticsearch-qrcache
27
第7回Elasticsearch勉強会
クラスタイベントが発生したときに指定したスクリプトを実行する
利用例 マスターノードが切り替わった場合に通知する ノードが増減した場合にスクリプトを実行する
今後:Elasticsearchのバージョンによりイベント内容が異なるので、クラスターイベントを汎用化したい
Elasticsearch Event Hook https://github.com/codelibs/elasticsearch-eventhook
28
第7回Elasticsearch勉強会
ElasticsearchのREST APIをアクセス制御するプラグイン ユーザー管理 REST APIのアクセス管理 ログイン/ログアウト/トークン
デフォルトのユーザー管理はElasticsearchのインデックスを利用(拡張可能な実装)
パス、HTTPメソッド、ロールの組み合わせ 今後:shieldの内容を見て考える(と思う)
Elasticsearch Auth https://github.com/codelibs/elasticsearch-auth
29
第7回Elasticsearch勉強会
その他
30
第7回Elasticsearch勉強会
Javaのコード上でElasticsearchのクラスタを立ち上げる
1つのJVM上に複数のElasticsearchを起動することが可能
利用例 JunitなどのテストケースでElasticsearchを立ち上げて動作確認する
バッチ処理の中でElasticsearchを立ち上げ、スナップショットから復元して処理する(本稼働のESに影響を与えずに同等のインデックスで処理可能)
Elastisearchの動作調査や学習目的での利用
Elasticsearch Cluster Runner https://github.com/codelibs/elasticsearch-cluster-runner
31
第7回Elasticsearch勉強会
まとめ
32
第7回Elasticsearch勉強会
まとめ (プラグイン作りについて)
プラグインを作れば、Elasticsearchをいろいろと拡張できるので、可能性が広がる Solrと比較してもプラグインは作りやすいし、導入しやすい
結構、いろいろと差し替えることができる
RESTのプラグインから作るとわかりやすい マニアックなことしたいと情報はソースのみ
Elasticsearchのバージョンが上がると、 たまに動かなくなる可能性がある…
まだまだ作りたいプラグインがある…
33
第7回Elasticsearch勉強会
Q&A
34