Elasticsearch 安装自定义插件导致错误:插件 zip 中缺少 `elasticsearch` 目录

JCh*_*hao 0 elasticsearch elasticsearch-plugin

当我尝试安装我通过调用构建的插件时

./elasticsearch-plugin install file:///fullpath/to/zipfile/custome_plugin.zip
Run Code Online (Sandbox Code Playgroud)

它给了我这个错误:

ERROR: `elasticsearch` directory is missing in the plugin zip
Run Code Online (Sandbox Code Playgroud)

我正在阅读其他一些类似的帖子,许多人尝试安装 .jar 而不是 .zip。我确实尝试安装 .zip,但仍然显示相同的错误。

此外(可能与此问题无关),当我手动解压缩 zip 文件并将其放入插件文件夹时,elasticsearch-plugins list会列出自定义插件。在这种情况下,插件是一个自定义分析器,但不知何故映射无法识别分析器。是因为我没有正确安装吗?

编辑:

添加一点信息,当我关闭集群然后在插件手动解压缩并放入plugin目录后重新启动时,集群不会启动。我得到了看起来像的错误

[2017-08-31T11:15:52,668][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [] fatal error in thread [main], exiting
java.lang.NoClassDefFoundError: org/elasticsearch/index/analysis/AnalysisModule$AnalysisBinderProcessor
    at java.lang.Class.getDeclaredConstructors0(Native Method) ~[?:1.8.0_65]
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671) ~[?:1.8.0_65]
    at java.lang.Class.getConstructor0(Class.java:3075) ~[?:1.8.0_65]
    at java.lang.Class.getConstructor(Class.java:1825) ~[?:1.8.0_65]
    at org.elasticsearch.plugins.PluginsService.loadPlugin(PluginsService.java:423) ~[elasticsearch-5.5.2.jar:5.5.2]
    at org.elasticsearch.plugins.PluginsService.loadBundles(PluginsService.java:387) ~[elasticsearch-5.5.2.jar:5.5.2]
    at org.elasticsearch.plugins.PluginsService.<init>(PluginsService.java:140) ~[elasticsearch-5.5.2.jar:5.5.2]
    at org.elasticsearch.node.Node.<init>(Node.java:312) ~[elasticsearch-5.5.2.jar:5.5.2]
    at org.elasticsearch.node.Node.<init>(Node.java:244) ~[elasticsearch-5.5.2.jar:5.5.2]
    at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:232) ~[elasticsearch-5.5.2.jar:5.5.2]
    at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:232) ~[elasticsearch-5.5.2.jar:5.5.2]
    at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:351) ~[elasticsearch-5.5.2.jar:5.5.2]
    at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:123) ~[elasticsearch-5.5.2.jar:5.5.2]
    at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:114) ~[elasticsearch-5.5.2.jar:5.5.2]
    at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:67) ~[elasticsearch-5.5.2.jar:5.5.2]
    at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:122) ~[elasticsearch-5.5.2.jar:5.5.2]
    at org.elasticsearch.cli.Command.main(Command.java:88) ~[elasticsearch-5.5.2.jar:5.5.2]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:91) ~[elasticsearch-5.5.2.jar:5.5.2]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:84) ~[elasticsearch-5.5.2.jar:5.5.2]
Caused by: java.lang.ClassNotFoundException: org.elasticsearch.index.analysis.AnalysisModule$AnalysisBinderProcessor
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[?:1.8.0_65]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:1.8.0_65]
    at java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java:814) ~[?:1.8.0_65]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_65]
    ... 19 more
Run Code Online (Sandbox Code Playgroud)

好像是这个分析

有没有我遗漏的图书馆?

编辑 2:经过更多的挖掘,我找到了这个网站

http://snacktrace.com/artifacts/org.elasticsearch/elasticsearch/1.7.3/org.elasticsearch.index.analysis.AnalysisModule $AnalysisBinderProcessor$AnalyzersBindings

似乎这AnalyzersBindings仅适用于 ES 1.x 和 2.x (<2.4)?我需要一种方法来替换它。

编辑 3:根据要求,这里是 AnalyzerBinding 最初的使用方式

package org.elasticsearch.plugin.analysis.my.analyzer;

import org.elasticsearch.index.analysis.AnalysisModule;

public class AnalyzerBinderProcessor extends AnalysisModule.AnalysisBinderProcessor {

    @Override
    public void processAnalyzers(AnalyzersBindings analyzersBindings) {
        analyzersBindings.processAnalyzer("my_name", AnalyzerProvider.class);
    }

    @Override
    public void processTokenFilters(TokenFiltersBindings tokenFiltersBindings) {
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在我的 AnalyzerPlugin.java 我有

public class AnalyzerPlugin extends Plugin {
    //some other code here that's not related to Binder 

    public void onModule(AnalysisModule module) {
        module.addProcessor(new AnalyzerBinderProcessor());
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑4:这是永无止境的......

如果我保留@Override,它会抛出

[ERROR] /opt/bg/analytics/src/java/src/analyzer5.0/src/main/java/org/elasticsearch/plugin/analysis/my_analyzer/AnalyzerPlugin.java:[16,5] method does not override or implement a method from a supertype
Run Code Online (Sandbox Code Playgroud)

另外,面临一个问题

[ERROR] /opt/bg/analytics/src/java/src/analyzer5.0/src/main/java/org/elasticsearch/plugin/analysis/my_analyzer/AnalyzerPlugin.java:[36,17] onModule(org.elasticsearch.indices.analysis.AnalysisModule) in org.elasticsearch.plugin.analysis.my_analyzer.AnalyzerPlugin cannot override onModule(org.elasticsearch.indices.analysis.AnalysisModule) in org.elasticsearch.plugins.Plugin
Run Code Online (Sandbox Code Playgroud)

因为 overridden method is final

这是从旧Plugin到新的更新吗?我好失落......

我觉得我需要一个关于如何为自定义分析器创建插件的完整教程,到目前为止我能找到的就是这个

http://david.pilato.fr/blog/2016/10/16/creating-a-plugin-for-elasticsearch-5-dot-0-using-maven-updated-for-ga/

这没有多大帮助。有人有好的链接吗?

bta*_*aek 5

看起来您已经修复了错误。

但是,我想我会添加我的学习内容,以防有人ERROR: 'elasticsearch' directory is missing in the plugin zip因为我犯的错误而犯同样的错误。

正如 Elasticsearch 文档(https://www.elastic.co/guide/en/elasticsearch/plugins/current/plugin-authors.html)中所述,插件的文件夹名称应在文件夹之前为“elasticsearch”压缩为 zip 文件。

所以,不管zip文件的名字是“elasticsearch-analysis-mecab-ko-5.5.3.0.zip”,压缩前​​的插件文件夹都应该叫“elasticsearch”。如果文件夹名称不是“elasticsearch”,当您运行 elasticsearch-plugin install 时,您的 elasticsearch 只会给您ERROR: 'elasticsearch' directory is missing in the plugin zip

因此,在创建或修改自定义插件文件夹后,对其进行压缩:

$ zip -r elasticsearch-analysis-mecab-ko-5.5.3.0.zip elasticsearch

然后安装插件

$ ./elasticsearch-plugin install file:///Users/btaek/Desktop/ElasticSearch/elasticsearch-analysis-mecab-ko-5.5.3.0.zip