More Related Content
Similar to Elasticsearchプラグインの作り方 (20)
More from Shinsuke Sugaya (11)
Elasticsearchプラグインの作り方
- 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
- 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. 第7回Elasticsearch勉強会
プラグインのzipファイルを生成 $ mvn package (target/releasesディレクトリ以下に生成される)
プラグインのインストール $ $ES_HOME/bin/plugin –i yourplugin -u file:/path/elasticsearch-yourplugin.zip あとはElasticsearchを再起動すればOK!
プラグインの生成
8
- 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. 第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. 第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. 第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をこの辺に記述する
- 16. 第7回Elasticsearch勉強会
ウェブサイトをクロールして、ページをイン デックス化する (サイト内検索にも利用可)
全文検索サーバFessと同じクローラー
CSSクエリーによるウェブスクレイピング
スクリプトにより編集して登録
クロール開始時間をスケジュール
BASIC/DIGEST/NTLM認証に対応
attachmentタイプもサポート
Elasticsearch River Web
https://github.com/codelibs/elasticsearch-river-web
16
- 18. 第7回Elasticsearch勉強会
Mahout Tasteをベースのリコメンド機能
利用者/商品/嗜好データ管理
情報をインデックスで管理
利用者/商品ベースのリコメンド
類似利用者の算出
テキスト分析 (商品情報のタームベクターの 生成等)
「利用者/商品/嗜好→ドキュメント/ターム/ 出現数」として、協調フィルタリングによる ドキュメントのリコメンド
Elasticsearch Taste
https://github.com/codelibs/elasticsearch-taste
18
- 19. 第7回Elasticsearch勉強会
生成済みのインデックスをコピーして、 新しいインデックスを作成する
_sourceからデータをスクロールスキャンして、 インデックスを生成
簡単にインデックスをコピー可能
利用例
テスト等で既存インデックスから、Analyzerや マッピングが異なるインデックスを作成する
今後:他のクラスターに対しても再インデク シングを可能にしたい
Elasticsearch Reindexing
https://github.com/codelibs/elasticsearch-reindexing
19
- 20. 第7回Elasticsearch勉強会
Excel/CSV/バルクJSON形式でデータをダン プする
Excelでダンプできる!
…/_searchの代わりに…/_dataを指定する
利用例
Excel好きな人に結果を渡す
バルクJSON形式で部分抽出をして、別インデッ クスにバルク投入して利用(全データが必要 ない場合とか)
今後:内部ロジックでレスポンスの返却の仕 方を改善
Elasticsearch Data Format
https://github.com/codelibs/elasticsearch-dataformat
20
- 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
- 25. 第7回Elasticsearch勉強会
インデクシング時に指定されたフィールドの 単語に対するb-bit MinHashを計算・保存
簡単にいうと、MinHashは高速に2つのデータを 比較する方法 (文書も指定したビット列に変換さ れ、それだけを比較することで一致を判断)
プラグインでバイトフィールドに格納
0/1のビットの文字列でも格納可能
利用例
類似文書の検索
高速に類似ドキュメントを計算
Elasticsearch MinHash
https://github.com/codelibs/elasticsearch-minhash
25
- 26. 第7回Elasticsearch勉強会
検索結果の上位N件を並び替える
並び替えはスクリプト言語で記述する
標準のRescoringはシャード単位だが、 DynaRankはマージされた結果に対して 並び替えを行う
N+1番目以降は通常の検索結果と同様
インデックス設定を変更することで、動的に 有効・無効にすることができる
利用例
特定の内容は上位に表示する
検索結果の重複をなくす
Elasticsearch DynaRank
https://github.com/codelibs/elasticsearch-dynarank
26
- 27. 第7回Elasticsearch勉強会
検索結果をキャッシュする
Solrでいうと、Query Result Cacheのこと (QRコードのキャッシュではないです…)
インデックスがあまり更新されないような ケースで有効
リアルタイムとは逆行するがインデックスの 種類によっては更新頻度が低いものもある
キャッシュは保存量、期限、Refreshの呼び 出しにより、クリア可能
Elasticsearch QRCache
https://github.com/codelibs/elasticsearch-qrcache
27
- 29. 第7回Elasticsearch勉強会
ElasticsearchのREST APIをアクセス制御す るプラグイン
ユーザー管理
REST APIのアクセス管理
ログイン/ログアウト/トークン
デフォルトのユーザー管理はElasticsearchの インデックスを利用(拡張可能な実装)
パス、HTTPメソッド、ロールの組み合わせ
今後:shieldの内容を見て考える(と思う)
Elasticsearch Auth
https://github.com/codelibs/elasticsearch-auth
29
- 31. 第7回Elasticsearch勉強会
Javaのコード上でElasticsearchのクラスタ を立ち上げる
1つのJVM上に複数のElasticsearchを起動す ることが可能
利用例
JunitなどのテストケースでElasticsearchを立ち 上げて動作確認する
バッチ処理の中でElasticsearchを立ち上げ、ス ナップショットから復元して処理する(本稼働の ESに影響を与えずに同等のインデックスで処理 可能)
Elastisearchの動作調査や学習目的での利用
Elasticsearch Cluster Runner
https://github.com/codelibs/elasticsearch-cluster-runner
31
- 33. 第7回Elasticsearch勉強会
まとめ (プラグイン作りについて)
プラグインを作れば、Elasticsearchをいろ いろと拡張できるので、可能性が広がる
Solrと比較してもプラグインは作りやすいし、 導入しやすい
結構、いろいろと差し替えることができる
RESTのプラグインから作るとわかりやすい
マニアックなことしたいと情報はソースのみ
Elasticsearchのバージョンが上がると、 たまに動かなくなる可能性がある…
まだまだ作りたいプラグインがある…
33