Top Banner
変変変変変変変変変変 変変変 変変変変
34

Elasticsearch 変わり種プラグインの作り方

Aug 08, 2015

Download

Technology

Ryoji Kurosawa
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Elasticsearch 変わり種プラグインの作り方

変わり種プラグインの作り方

黒澤亮二

Page 2: Elasticsearch 変わり種プラグインの作り方

自己紹介

• 黒澤亮二 @rjkuro• 日本 IBM• データベース周辺の製品開発• Elasticsearch 暦 6 ヶ月• 最近の興味:

分散データベースNoSQLSearch/Analysis

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

自己紹介

• 黒澤亮二 @rjkuro• 日本 IBM• データベース周辺の製品開発• Elasticsearch 暦 6 ヶ月• 最近の興味:

分散データベースNoSQLSearch/Analysis

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

自己紹介

• 黒澤亮二• 日本 IBM• データベース周辺のソフト開発• Elasticsearch 暦 6 ヶ月• 最近の興味:分散 DB, NoSQL, 検索

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

disclaimer

• 嘘知識を聴く可能性があります• 聞き間違いだと思ってください• 資料は後からこっそり直す可能性があります

• 本資料は私自身の見解であり、必ずしも私の所属する組織の立場、戦略、意見を代表するものではありません。

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

本日の主張

つくれるよいろんなプラグイン

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

Elasticsearch はプラグインで機能を追加できる

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

既存のたくさんあるし

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

簡単につくれるよ

maven

bin/plugin --install myplugin --url file:///test/myplugin.zip

pom.xmles-plugin.propertiesplugin.xmlMyPlugin.javaMyModule.java

myplugin.zip

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

プラグイン作れるといいことあるよ

アプリ Elasticsearch

アプリでの処理を…

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

プラグイン作れるといいことあるよ

アプリ Elasticsearch

Elasticsearch ノードで動かせる!!

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

スケールする!

アプリ Elasticsearch Elasticsearch

Elasticsearch Elasticsearch

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

スケールする!!

アプリ Elastic Elastic Elastic

Elastic Elastic Elastic

Elastic Elastic Elastic

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

スケールする!!!

アプリ

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

いろいろできるよ

モジュールで「登録メソッド」をよんで新機能を差しこめる!

River プラグインはこれ

Analyzer プラグインはこれ

https://www.found.no/foundation/elasticsearch-internals/

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

登録メソッドたくさん!AnalysisModule.addTokenizer(String name, Class<? extends TokenizerFactory> tokenizer)AnalysisModule.addTokenFilter(String name, Class<? extends TokenFilterFactory> tokenFilter)AnalysisModule.addCharFilter(String name, Class<? extends CharFilterFactory> charFilter)AnalysisModule.addAnalyzer(String name, Class<? extends AnalyzerProvider> analyzer)RestController.registerHandler(RestRequest.Method method, String path, RestHandler handler)RestModule.addRestAction(Class<? extends BaseRestHandler> restAction)DocumentMapperParser.putTypeParser(String type, Mapper.TypeParser typeParser)HighlightModule.registerHighlighter(Class<? extends Highlighter> clazz)IndicesLifecycle.addListener(Listener listener)IndexQueryParserModule.addQueryParser(String name, Class<? extends QueryParser> queryParser)

プラグイン専用ではなくElasticsearch 本体も使ってます

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

プラグインから登録メソッドどうやって呼ぶか?

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

1. es-plugin.properties に自分の Plugin クラス名を書く

2. Plugin クラスで自分の Module クラスを登録 (onModule があればここで登録メソッドを呼べる場合も )

3. 自分の Module クラスの configure()に自分のコンポーネントの生成方法を指定

4. コンポーネントのクラスのコンストラクタに @injection をつける

5. コンストラクタの引数にほしいものを書く

6. 受け取ったものを使って登録メソッドを呼ぶ

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

1. es-plugin.properties に自分の Plugin クラス名を書く

2. Plugin クラスで自分の Module クラスを登録 (onModule があればここで登録メソッドを呼べる場合も )

3. 自分の Module クラスの configure()に自分のコンポーネントの生成方法を指定

4. コンポーネントのクラスのコンストラクタに @injection をつける

5. コンストラクタの引数にほしいものを書く

6. 受け取ったものを使って登録メソッドを呼ぶ

→  例で

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

例 Mapper プラグイン

Mapper モジュール

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

plugin=myplugin.MyPlugin

public class MyPlugin extends AbstractPlugin {

  public Collection<Class<? extends Module>> indexModules() { Collection<Class<? extends Module>>

modules = Lists.newArrayList(); modules.add(MyMapperModule.class); return modules; } … …

私のプラグインのクラス名

私のモジュールを登録

es-plugin.properties

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

public class MyMapperModule extends AbstractModule { @Override protected void configure() { bind(MyMapperComponent.class).asEagerSingleton(); }}

public class MyMapperComponent extends AbstractIndexComponent {

@Inject public MyMapperComponent(Index index,

@IndexSettings Settings indexSettings, MapperService mapperService) {

super(index, indexSettings);

mapperService.documentMapperParser() .putTypeParser("my_type",

new MyMapper.TypeParser()); }}

「私のクラスを起動時に生成してよー」

欲しいものを渡してもらっ

登録メソッドが呼べた

ここで Guice のおまじないをすると…

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

使いみちは、Index 時の事前処理とかPUT /test/person/1{ "my_content" : "... 長い文章 ..."}

{ “content” : “... 処理済の文章 ...",}

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

解析処理をしてフィールド追加とかできる!PUT /test/person/1{ "my_content" : "... 長い文章 ..."}

{ "content" : "... 長い文章 ...", "language" : "ja", "classification" : "essay", "sentiment" : "positive", "advertised_products" : { ... } …}

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

なにか既視感?

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

元ネタはattachment プラグイン

PUT /test/person/1{ "my_attachment" : "... base64 ..."}

{ "my_attachment.title" : ".…", "my_attachment.date" : "...", "my_attachment.author" : "….", "my_attachment.keywords" : "…", "my_attachment.content_type" : "…", " …}

というわけで詳しくは:https://github.com/elastic/elasticsearch-mapper-attachments

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

例2: Custom query parser

Query モジュール

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

使いみち

• Match クエリ /Query String クエリでは物足りない場合• スコアを細かく制御したい場合• インデックスに特殊な構造を持たせてそれを

検索に利用したい場合

→  自前のシンタックスを実装したりLucene の Query 自体をカスタムして利用できる

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

登録メソッドを持ったオブジェクトが渡されてくる楽なパターンpublic class MyPlugin extends AbstractPlugin {

public void onModule(IndexQueryParserModule module) { module.addQueryParser("my_query",

MyQueryParser.class); } … …

登録メソッドここで呼べちゃう

public class MyQueryParser implements QueryParser {

public Query parse(QueryParseContext parseContext) throws IOException,   QueryParsingException {

XContentParser parser = parseContext.parser(); Token curToken = parser.currentToken();

…… トークンをパースして Query を返す処理 ……

Lucene のオブジェクトを返

せる

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

例その3: Lifecycle イベント処理

Indices モジュールIndicesLifecycle インターフェー

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

イベントをフックして処理を挿入できる!- インデックスやシャード

の open/close の前後- シャード移動の前後など

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

public class MyLifeCycleModule extends AbstractModule { @Override protected void configure() { bind(MyLifeCycleComponent.class).asEagerSingleton(); }}

「私のクラスを(ry 」

public class MyLifecycleComponent extends AbstractComponent { @Inject public MyLifecycleComponent(Settings settings, IndicesLifecycle indicesLifecycle) { super(settings); indicesLifecycle.addListener(

new IndicesLifecycle.Listener() { @Override public void

    afterIndexCreated(IndexService indexService) { … index が open されたときの処理 … }

登録メソッド

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

まとめ

• プラグインは使うだけじゃない• いろいろ作れる• スケールさせやすい• Guice が欲しいオブジェクトを渡してくれる• ストアドプロシージャー的な使い方もありか

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

参考資料

プラグイン一般 https://www.found.no/foundation/elasticsearch-internals/ https://www.found.no/foundation/writing-a-plugin/Attachment mapper pluginhttps://github.com/elastic/elasticsearch-mapper-attachmentsElasticsearch reference https://www.elastic.co/guide/en/elasticsearch/reference/1.5/index.html