More Related Content
Similar to Elasticsearch 変わり種プラグインの作り方 (20)
Elasticsearch 変わり種プラグインの作り方
- 2. 自己紹介
• 黒澤亮二 @rjkuro
• 日本IBM
• データベース周辺の製品開発
• Elasticsearch暦 1年
• 最近の興味:
分散データベース
NoSQL
Search/Analysis
- 14. 登録メソッドたくさん!
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本体も使ってます
- 19. 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
- 20. 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のおまじないをすると…
- 24. 元ネタは
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
- 27. 登録メソッドを持ったオブジェクト
が渡されてくる楽なパターン
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の
オブジェク
トを返せる
- 30. 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されたときの処理 …
}
登録メソッド