自己编写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

bannerAds