自己编写Elasticsearch插件
首先或起初
Elasticsearch中有各种各样的插件,可以自定义和增强其搜索和分析功能。这些插件不仅包括官方提供的插件,也包括由社区创造的大量插件。在这里,我们将说明如何创建自己的插件。
插件的种类 de
在Elasticsearch中,有许多种类的插件,如Analysis插件和Mapper插件等。在开始编写自定义插件之前,需要明确自己想要为Elasticsearch添加什么样的功能,以及该功能属于哪种类型的插件。
如果想要改善日语搜索功能,假设需要对由Japanese (kuromoji) Analysis Filter分割的令牌进行进一步处理,那么就需要自行制作Analysis插件(令牌过滤器)。
寻找可参考的源代码
在自制Elasticsearch插件方面的信息非常有限,尤其是关于最新版本的日语资料更是几乎没有。
GitHub上有许多不同插件的项目,但只有少数适用于新版本。因此最初我们会从Elasticsearch官方插件(核心插件)中寻找可作参考的实现(源代码)。
如果您要自制Analysis插件,可以参考以下源代码库中以analysis开头的插件。
-
- elasticsearch/plugins at master · elastic/elasticsearch
- https://github.com/elastic/elasticsearch/tree/master/plugins
项目的组成
以下有必要的文件共4个。
pom.xml
Mavenでのビルドの設定を記述したファイル。
plugin.xml
Mavenでのアセンブリの設定を記述したファイルで、プラグインを配布可能なZIP形式にまとめるのに使用される。
plugin-descriptor.properties
プラグインのロードに必要な情報(プラグインのJavaクラスやバージョン)を記述したファイル。
(プラグイン名)Plugin.java
プラグイン本体のJavaクラスで、これをビルドしたものが起動時に読み込まれる。
最好的方法是不要从头开始编写这些文件,而是复制参考插件项目并确保先进行一次成功的构建,然后逐渐进行个性化定制。
例如,在我创建的elasticsearch-concatenation-token-filter中,如下所示。
.
├── README.md
├── pom.xml
├── src
│ └── main
│ ├── assemblies
│ │ └── plugin.xml
│ ├── java
│ │ └── com
│ │ └── github
│ │ └── ryohashimoto
│ │ └── elasticsearch
│ │ ├── index
│ │ │ └── analysis
│ │ │ ├── ConcatenationTokenFilter.java
│ │ │ └── ConcatenationTokenFilterFactory.java
│ │ └── plugin
│ │ └── analysis
│ │ └── ConcatenationTokenFilterPlugin.java
| └── resources
| └── plugin-descriptor.properties
└── target
插件的实现
当项目准备好之后,将使用Java来实现插件的源代码。
在这里,我们将参考现有插件的源代码来实现Java类的功能。
举例来说,elasticsearch-concatenation-token-filter实现了TokenFilter类以及其Factory类。
- プラグイン(ConcatenationTokenFilterPlugin.java)
public class ConcatenationTokenFilterPlugin extends Plugin implements AnalysisPlugin {
@Override
public Map<String, AnalysisProvider<TokenFilterFactory>> getTokenFilters() {
return singletonMap("concatenation", ConcatenationTokenFilterFactory::new);
}
}
- トークンフィルタのFactoryクラス(ConcatenationTokenFilterFactory.java)
public class ConcatenationTokenFilterFactory extends AbstractTokenFilterFactory {
public ConcatenationTokenFilterFactory(IndexSettings indexSettings, Environment environment, String name, Settings settings) {
super(indexSettings, name, settings);
}
@Override
public TokenStream create(TokenStream tokenStream) {
return new ConcatenationTokenFilter(tokenStream);
}
}
- トークンフィルタのクラス(ConcatenationTokenFilter.java)
public class ConcatenationTokenFilter extends TokenFilter {
...
}
构建和安装
必须确保POM文件中的配置与要构建插件时使用的Elasticsearch版本和要安装的Elasticsearch版本一致。
如果要在建立和安装Elasticsearch 6.5.0时同时使用,可以按照以下步骤进行操作。
<elasticsearch.version>6.5.0</elasticsearch.version>
请使用以下命令进行构建。
mvn package
如果输出结果显示为“BUILD SUCCESS”,那么就表示成功地构建了。
[INFO] Building zip: /Users/ryo/Repos/elasticsearch-concatenation-token-filter/target/releases/elasticsearch-concatenation-token-filter-6.5.0.1.zip
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.833 s
[INFO] Finished at: 2018-12-09T23:22:14+09:00
[INFO] ------------------------------------------------------------------------
要进行安装,请使用以下命令。
elasticsearch-plugin install file://(プラグインファイルのパス)
在这里的(插件文件路径)部分,需要指定由mvn package命令输出的ZIP文件路径(包括”Building zip:”之后的部分)。
使用插件
当成功安装后,根据插件类型进行设置并尝试实际使用。
在处理Analysis插件时,尝试应用于分析器的设置,并确保能够获得实际正确的结果。
总结
我已经整理了一下如何自己制作并使用Elasticsearch的插件的方法,虽然很简单,希望对你有所帮助。
请引用以下内容:
-
- Elasticsearch Plugins and Integrations
-
- https://www.elastic.co/guide/en/elasticsearch/plugins/current/index.html
Help for plugin authors
https://www.elastic.co/guide/en/elasticsearch/plugins/current/plugin-authors.html