elasticsearch 6.x插件开发

需求:在开发中需要安装自己特殊的需求对数据进行匹配和计算, 如图片相似度计算等,这时需要用到es插件

开发版本:elasticsearch 6.x   

                 java 8

5:本例的项目代码

开发步骤:

      1: 新建maven项目和maven编译插件 , maven项目管理工具能让你轻松构建项目以及解决麻烦的jar包依赖问题

<dependencies>
    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>6.2.2</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
       <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>
       2: 继承核心类

                 初始化插件: 继承 Plugin类,elasticsearch解析和注册插件

public class DemoPlugin extends Plugin implements ScriptPlugin {
    private final static Logger logger = LogManager.getLogger(com.esplugin.demo.DemoPlugin.class);


    @Override
    public ScriptEngine getScriptEngine(Settings settings, Collection<ScriptContext<?>> contexts) {
        logger.info("contexts : {} ", Arrays.toString(contexts.toArray()));
        return new MyScriptEngine();
    }

}

        3: 核心处理类     ScriptEngine  6.x之后替换native scripts 使用 ScriptEngine 来注册和解析插件

         构建自己的业务实现  ,构建自己的业务逻辑并且返回数据类型 , 这里我只是实现一个简单的demo,

        获取前端输入值和获取es的存储值,进行比较以及返回结果类型

public class MyScriptEngine implements ScriptEngine {
    private final static Logger logger = LogManager.getLogger(MyScriptEngine.class);

    @Override
    public String getType() {
        return "expert_scripts"; //for lang
    }

    @Override
    public <T> T compile(String scriptName, String scriptSource, ScriptContext<T> context, Map<String, String> params) {
        logger.info("use params the scriptName {} ,scriptSource  {}, context {},params {}", scriptName, scriptSource, context.name, params.entrySet());
        // use type search
        if (!context.equals(SearchScript.CONTEXT)) {
            throw new IllegalArgumentException(getType() + " scripts cannot be used for context [" + context.name + "]");
        }

        final String first = XContentMapValues.nodeStringValue(params.get("first"), null);
        final String second = XContentMapValues.nodeStringValue(params.get("second"), null);
        logger.info("first : {} , second : {} ", first, second);

        // query script use "source" value with identifier
        if ("demoPlugin".equals(scriptSource)) {
            SearchScript.Factory factory = (p, lookup) -> new SearchScript.LeafFactory() {
                @Override
                public SearchScript newInstance(LeafReaderContext context) throws IOException {
                    return new SearchScript(p, lookup, context) {
                        @Override
                        public double runAsDouble() {
                            // get es data
                            final String test = (String) lookup.source().get("test");
                            logger.info("get source test data : {} ", test);
                            if (first != null && first.equals(test)) {
                                return 1.0D;
                            }
                            return Double.MAX_VALUE;
                        }
                    };
                }

                @Override
                public boolean needs_score() {
                    return false;
                }
            };

            return context.factoryClazz.cast(factory);
        }
        throw new IllegalArgumentException("Unknown script name " + scriptSource);
    }

    @Override
    public void close() {
        // optionally close resources
    }
}

这里只是一个测试用例,使用


    4:示例代码:

        https://github.com/ailice001/es-plugin-6x

猜你喜欢

转载自blog.csdn.net/ailice001/article/details/79616423