Elasticsearchプラグインの作り方

34
Elasticsearchプラグインの作り方 ~ CodeLibsの便利なプラグイン紹介 第7回Elasticsearch勉強会

description

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

Transcript of Elasticsearchプラグインの作り方

Page 1: Elasticsearchプラグインの作り方

Elasticsearchプラグインの作り方 ~ CodeLibsの便利なプラグイン紹介

第7回Elasticsearch勉強会

Page 2: 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

Page 3: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

アジェンダ

Elasticsearchプラグインとは プラグインの作り方 CodeLibsのプラグイン紹介 まとめ

3

Page 4: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

Elasticsearchプラグインとは

4

Page 5: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

Elasticsearchの機能を拡張する仕組み pluginコマンドにより簡単にインストール プラグインは2種類ある ネイティブなプラグイン (今日は主にコレ)

Elasticsearchの機能自体を変更・拡張する

サイトプラグイン HeadやkopfのようにHTMLでの情報提供系

ネイティブなプラグインはJavaで作り、jarファイルをzipでまとめたもの

Elasticsearchプラグインとは

5

Page 6: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

プラグインの作り方

6

Page 7: Elasticsearchプラグインの作り方

第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

Page 8: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

プラグインのzipファイルを生成 $ mvn package (target/releasesディレクトリ以下に生成される)

プラグインのインストール $ $ES_HOME/bin/plugin –i yourplugin -u file:/path/elasticsearch-yourplugin.zip

あとはElasticsearchを再起動すればOK!

プラグインの生成

8

Page 9: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

という感じで、 Elasticsearchプラグインは

簡単に作って インストールできます

9

Page 10: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

もう少し プラグインの作り方の

説明します…

10

Page 11: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

Elasticsearchプラグインを作成するためのMaven Archetype ブランクプロジェクト(ひな形)が作成できる

コマンド一つでプロジェクトが作成可能 Elasticsearch 1.xごとにArchetypeは提供 Elasticsearchがマイナーバージョンアップで I/Fが変わるため、作り直している…

シンプルなプロジェクトが作成されるので、必要なものを追加や削除すれば、簡単にElasticsearchのプラグインができます!

Elasticsearch Plugin Archetype https://github.com/codelibs/elasticsearch-plugin-archetype

11

Page 12: Elasticsearchプラグインの作り方

第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

Page 13: Elasticsearchプラグインの作り方

第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メソッドやパスを指定する

Page 14: Elasticsearchプラグインの作り方

第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をこの辺に記述する

Page 15: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

CodeLibsプラグインの紹介

15

Page 16: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

ウェブサイトをクロールして、ページをインデックス化する (サイト内検索にも利用可) 全文検索サーバFessと同じクローラー

CSSクエリーによるウェブスクレイピング スクリプトにより編集して登録 クロール開始時間をスケジュール BASIC/DIGEST/NTLM認証に対応 attachmentタイプもサポート

Elasticsearch River Web https://github.com/codelibs/elasticsearch-river-web

16

Page 17: Elasticsearchプラグインの作り方

第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

Page 18: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

Mahout Tasteをベースのリコメンド機能 利用者/商品/嗜好データ管理 情報をインデックスで管理

利用者/商品ベースのリコメンド 類似利用者の算出 テキスト分析 (商品情報のタームベクターの生成等)

「利用者/商品/嗜好→ドキュメント/ターム/出現数」として、協調フィルタリングによるドキュメントのリコメンド

Elasticsearch Taste https://github.com/codelibs/elasticsearch-taste

18

Page 19: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

生成済みのインデックスをコピーして、 新しいインデックスを作成する _sourceからデータをスクロールスキャンして、インデックスを生成

簡単にインデックスをコピー可能 利用例 テスト等で既存インデックスから、Analyzerやマッピングが異なるインデックスを作成する

今後:他のクラスターに対しても再インデクシングを可能にしたい

Elasticsearch Reindexing https://github.com/codelibs/elasticsearch-reindexing

19

Page 20: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

Excel/CSV/バルクJSON形式でデータをダンプする Excelでダンプできる!

…/_searchの代わりに…/_dataを指定する 利用例 Excel好きな人に結果を渡す バルクJSON形式で部分抽出をして、別インデックスにバルク投入して利用(全データが必要 ない場合とか)

今後:内部ロジックでレスポンスの返却の仕方を改善

Elasticsearch Data Format https://github.com/codelibs/elasticsearch-dataformat

20

Page 21: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

スクリプトを利用したクエリーテンプレート 任意のスクリプト言語でクエリーを組み立てる

(標準のmustacheは穴埋め的なクエリー作成が可能だがそれでは物足りない人向け)

標準のクエリーテンプレートとほぼ同じ langを指定する追加する

パラメータ書き換えのためのフィルタ機能 利用例 パラメータによりクエリーを変更する A/Bテスト

https://github.com/codelibs/elasticsearch-sstmpl

Elasticsearch Script-based Search Template

21

Page 22: Elasticsearchプラグインの作り方

第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

Page 23: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

Handlebarsをスクリプト言語としてElasticsearchに追加する

クエリーテンプレートで標準のmustacheでできなかった、ロジックが書ける

HandlebarsのHelperもjsファイルで記述することが可能

Elasticsearch Handlebars Lang https://github.com/codelibs/elasticsearch-lang-handlebars

23

Page 24: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

Velocityをスクリプト言語としてElasticsearchに追加する

クエリーテンプレートでVelocityが利用可能 Dynamic Scriptingを有効にする

script.disable_dynamic: false

Elasticsearch Velocity Lang https://github.com/codelibs/elasticsearch-lang-velocity

24

Page 25: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

インデクシング時に指定されたフィールドの単語に対するb-bit MinHashを計算・保存 簡単にいうと、MinHashは高速に2つのデータを比較する方法 (文書も指定したビット列に変換され、それだけを比較することで一致を判断)

プラグインでバイトフィールドに格納 0/1のビットの文字列でも格納可能

利用例 類似文書の検索 高速に類似ドキュメントを計算

Elasticsearch MinHash https://github.com/codelibs/elasticsearch-minhash

25

Page 26: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

検索結果の上位N件を並び替える 並び替えはスクリプト言語で記述する 標準のRescoringはシャード単位だが、

DynaRankはマージされた結果に対して 並び替えを行う

N+1番目以降は通常の検索結果と同様 インデックス設定を変更することで、動的に 有効・無効にすることができる

利用例 特定の内容は上位に表示する 検索結果の重複をなくす

Elasticsearch DynaRank https://github.com/codelibs/elasticsearch-dynarank

26

Page 27: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

検索結果をキャッシュする Solrでいうと、Query Result Cacheのこと

(QRコードのキャッシュではないです…)

インデックスがあまり更新されないようなケースで有効 リアルタイムとは逆行するがインデックスの 種類によっては更新頻度が低いものもある

キャッシュは保存量、期限、Refreshの呼び出しにより、クリア可能

Elasticsearch QRCache https://github.com/codelibs/elasticsearch-qrcache

27

Page 28: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

クラスタイベントが発生したときに指定したスクリプトを実行する

利用例 マスターノードが切り替わった場合に通知する ノードが増減した場合にスクリプトを実行する

今後:Elasticsearchのバージョンによりイベント内容が異なるので、クラスターイベントを汎用化したい

Elasticsearch Event Hook https://github.com/codelibs/elasticsearch-eventhook

28

Page 29: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

ElasticsearchのREST APIをアクセス制御するプラグイン ユーザー管理 REST APIのアクセス管理 ログイン/ログアウト/トークン

デフォルトのユーザー管理はElasticsearchのインデックスを利用(拡張可能な実装)

パス、HTTPメソッド、ロールの組み合わせ 今後:shieldの内容を見て考える(と思う)

Elasticsearch Auth https://github.com/codelibs/elasticsearch-auth

29

Page 30: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

その他

30

Page 31: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

Javaのコード上でElasticsearchのクラスタを立ち上げる

1つのJVM上に複数のElasticsearchを起動することが可能

利用例 JunitなどのテストケースでElasticsearchを立ち上げて動作確認する

バッチ処理の中でElasticsearchを立ち上げ、スナップショットから復元して処理する(本稼働のESに影響を与えずに同等のインデックスで処理可能)

Elastisearchの動作調査や学習目的での利用

Elasticsearch Cluster Runner https://github.com/codelibs/elasticsearch-cluster-runner

31

Page 32: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

まとめ

32

Page 33: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

まとめ (プラグイン作りについて)

プラグインを作れば、Elasticsearchをいろいろと拡張できるので、可能性が広がる Solrと比較してもプラグインは作りやすいし、導入しやすい

結構、いろいろと差し替えることができる

RESTのプラグインから作るとわかりやすい マニアックなことしたいと情報はソースのみ

Elasticsearchのバージョンが上がると、 たまに動かなくなる可能性がある…

まだまだ作りたいプラグインがある…

33

Page 34: Elasticsearchプラグインの作り方

第7回Elasticsearch勉強会

Q&A

34