Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Elasticsearchプラグインの作り方

10,816 views

Published on

Elasticsearchプラグインの簡単な作り方を紹介します。また、Elasticsearchを便利に利用するためのプラグインも紹介します。

Published in: Engineering
  • Be the first to comment

Elasticsearchプラグインの作り方

  1. 1. Elasticsearchプラグインの作り方 ~ CodeLibsの便利なプラグイン紹介 第7回Elasticsearch勉強会
  2. 2. 第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
  3. 3. 第7回Elasticsearch勉強会 アジェンダ Elasticsearchプラグインとは プラグインの作り方 CodeLibsのプラグイン紹介 まとめ 3
  4. 4. 第7回Elasticsearch勉強会 Elasticsearchプラグインとは 4
  5. 5. 第7回Elasticsearch勉強会 Elasticsearchの機能を拡張する仕組み pluginコマンドにより簡単にインストール プラグインは2種類ある ネイティブなプラグイン (今日は主にコレ) Elasticsearchの機能自体を変更・拡張する サイトプラグイン HeadやkopfのようにHTMLでの情報提供系 ネイティブなプラグインはJavaで作り、jar ファイルをzipでまとめたもの Elasticsearchプラグインとは 5
  6. 6. 第7回Elasticsearch勉強会 プラグインの作り方 6
  7. 7. 第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
  8. 8. 第7回Elasticsearch勉強会 プラグインのzipファイルを生成 $ mvn package (target/releasesディレクトリ以下に生成される) プラグインのインストール $ $ES_HOME/bin/plugin –i yourplugin -u file:/path/elasticsearch-yourplugin.zip あとはElasticsearchを再起動すればOK! プラグインの生成 8
  9. 9. 第7回Elasticsearch勉強会 という感じで、 Elasticsearchプラグインは 簡単に作って インストールできます 9
  10. 10. 第7回Elasticsearch勉強会 もう少し プラグインの作り方の 説明します… 10
  11. 11. 第7回Elasticsearch勉強会 Elasticsearchプラグインを作成するための Maven Archetype ブランクプロジェクト(ひな形)が作成できる コマンド一つでプロジェクトが作成可能 Elasticsearch 1.xごとにArchetypeは提供 Elasticsearchがマイナーバージョンアップで I/Fが変わるため、作り直している… シンプルなプロジェクトが作成されるので、 必要なものを追加や削除すれば、簡単に Elasticsearchのプラグインができます! Elasticsearch Plugin Archetype https://github.com/codelibs/elasticsearch-plugin-archetype 11
  12. 12. 第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
  13. 13. 第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メソッドやパスを指定する
  14. 14. 第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をこの辺に記述する
  15. 15. 第7回Elasticsearch勉強会 CodeLibsプラグインの紹介 15
  16. 16. 第7回Elasticsearch勉強会 ウェブサイトをクロールして、ページをイン デックス化する (サイト内検索にも利用可) 全文検索サーバFessと同じクローラー CSSクエリーによるウェブスクレイピング スクリプトにより編集して登録 クロール開始時間をスケジュール BASIC/DIGEST/NTLM認証に対応 attachmentタイプもサポート Elasticsearch River Web https://github.com/codelibs/elasticsearch-river-web 16
  17. 17. 第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
  18. 18. 第7回Elasticsearch勉強会 Mahout Tasteをベースのリコメンド機能 利用者/商品/嗜好データ管理 情報をインデックスで管理 利用者/商品ベースのリコメンド 類似利用者の算出 テキスト分析 (商品情報のタームベクターの 生成等) 「利用者/商品/嗜好→ドキュメント/ターム/ 出現数」として、協調フィルタリングによる ドキュメントのリコメンド Elasticsearch Taste https://github.com/codelibs/elasticsearch-taste 18
  19. 19. 第7回Elasticsearch勉強会 生成済みのインデックスをコピーして、 新しいインデックスを作成する _sourceからデータをスクロールスキャンして、 インデックスを生成 簡単にインデックスをコピー可能 利用例 テスト等で既存インデックスから、Analyzerや マッピングが異なるインデックスを作成する 今後:他のクラスターに対しても再インデク シングを可能にしたい Elasticsearch Reindexing https://github.com/codelibs/elasticsearch-reindexing 19
  20. 20. 第7回Elasticsearch勉強会 Excel/CSV/バルクJSON形式でデータをダン プする Excelでダンプできる! …/_searchの代わりに…/_dataを指定する 利用例 Excel好きな人に結果を渡す バルクJSON形式で部分抽出をして、別インデッ クスにバルク投入して利用(全データが必要 ない場合とか) 今後:内部ロジックでレスポンスの返却の仕 方を改善 Elasticsearch Data Format https://github.com/codelibs/elasticsearch-dataformat 20
  21. 21. 第7回Elasticsearch勉強会 スクリプトを利用したクエリーテンプレート 任意のスクリプト言語でクエリーを組み立てる (標準のmustacheは穴埋め的なクエリー作成が 可能だがそれでは物足りない人向け) 標準のクエリーテンプレートとほぼ同じ langを指定する追加する パラメータ書き換えのためのフィルタ機能 利用例 パラメータによりクエリーを変更する A/Bテスト https://github.com/codelibs/elasticsearch-sstmpl Elasticsearch Script-based Search Template 21
  22. 22. 第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
  23. 23. 第7回Elasticsearch勉強会 Handlebarsをスクリプト言語として Elasticsearchに追加する クエリーテンプレートで標準のmustacheで できなかった、ロジックが書ける HandlebarsのHelperもjsファイルで記述す ることが可能 Elasticsearch Handlebars Lang https://github.com/codelibs/elasticsearch-lang-handlebars 23
  24. 24. 第7回Elasticsearch勉強会 Velocityをスクリプト言語として Elasticsearchに追加する クエリーテンプレートでVelocityが利用可能 Dynamic Scriptingを有効にする script.disable_dynamic: false Elasticsearch Velocity Lang https://github.com/codelibs/elasticsearch-lang-velocity 24
  25. 25. 第7回Elasticsearch勉強会 インデクシング時に指定されたフィールドの 単語に対するb-bit MinHashを計算・保存 簡単にいうと、MinHashは高速に2つのデータを 比較する方法 (文書も指定したビット列に変換さ れ、それだけを比較することで一致を判断) プラグインでバイトフィールドに格納 0/1のビットの文字列でも格納可能 利用例 類似文書の検索 高速に類似ドキュメントを計算 Elasticsearch MinHash https://github.com/codelibs/elasticsearch-minhash 25
  26. 26. 第7回Elasticsearch勉強会 検索結果の上位N件を並び替える 並び替えはスクリプト言語で記述する 標準のRescoringはシャード単位だが、 DynaRankはマージされた結果に対して 並び替えを行う N+1番目以降は通常の検索結果と同様 インデックス設定を変更することで、動的に 有効・無効にすることができる 利用例 特定の内容は上位に表示する 検索結果の重複をなくす Elasticsearch DynaRank https://github.com/codelibs/elasticsearch-dynarank 26
  27. 27. 第7回Elasticsearch勉強会 検索結果をキャッシュする Solrでいうと、Query Result Cacheのこと (QRコードのキャッシュではないです…) インデックスがあまり更新されないような ケースで有効 リアルタイムとは逆行するがインデックスの 種類によっては更新頻度が低いものもある キャッシュは保存量、期限、Refreshの呼び 出しにより、クリア可能 Elasticsearch QRCache https://github.com/codelibs/elasticsearch-qrcache 27
  28. 28. 第7回Elasticsearch勉強会 クラスタイベントが発生したときに指定した スクリプトを実行する 利用例 マスターノードが切り替わった場合に通知する ノードが増減した場合にスクリプトを実行する 今後:Elasticsearchのバージョンによりイベ ント内容が異なるので、クラスターイベント を汎用化したい Elasticsearch Event Hook https://github.com/codelibs/elasticsearch-eventhook 28
  29. 29. 第7回Elasticsearch勉強会 ElasticsearchのREST APIをアクセス制御す るプラグイン ユーザー管理 REST APIのアクセス管理 ログイン/ログアウト/トークン デフォルトのユーザー管理はElasticsearchの インデックスを利用(拡張可能な実装) パス、HTTPメソッド、ロールの組み合わせ 今後:shieldの内容を見て考える(と思う) Elasticsearch Auth https://github.com/codelibs/elasticsearch-auth 29
  30. 30. 第7回Elasticsearch勉強会 その他 30
  31. 31. 第7回Elasticsearch勉強会 Javaのコード上でElasticsearchのクラスタ を立ち上げる 1つのJVM上に複数のElasticsearchを起動す ることが可能 利用例 JunitなどのテストケースでElasticsearchを立ち 上げて動作確認する バッチ処理の中でElasticsearchを立ち上げ、ス ナップショットから復元して処理する(本稼働の ESに影響を与えずに同等のインデックスで処理 可能) Elastisearchの動作調査や学習目的での利用 Elasticsearch Cluster Runner https://github.com/codelibs/elasticsearch-cluster-runner 31
  32. 32. 第7回Elasticsearch勉強会 まとめ 32
  33. 33. 第7回Elasticsearch勉強会 まとめ (プラグイン作りについて) プラグインを作れば、Elasticsearchをいろ いろと拡張できるので、可能性が広がる Solrと比較してもプラグインは作りやすいし、 導入しやすい 結構、いろいろと差し替えることができる RESTのプラグインから作るとわかりやすい マニアックなことしたいと情報はソースのみ Elasticsearchのバージョンが上がると、 たまに動かなくなる可能性がある… まだまだ作りたいプラグインがある… 33
  34. 34. 第7回Elasticsearch勉強会 Q&A 34

×