栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

elasticsearch自定义脚本插件实现列值自增

elasticsearch自定义脚本插件实现列值自增

一.使用java编写elasticsearch 自定义插件,对应的elasticsearch版本为6.8.4,以下代码用到三个类

com.suntown.UserscriptEnginePlugin、com.suntown.MyExpertscriptEngine、com.suntown.UserUpdateFactory

package com.suntown;


import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.scriptPlugin;
import org.elasticsearch.script.scriptContext;
import org.elasticsearch.script.scriptEngine;

import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;

public class UserscriptEnginePlugin extends Plugin implements scriptPlugin{
    @Override
    public scriptEngine getscriptEngine(Settings settings, Collection> contexts){
        return new MyExpertscriptEngine();
    }


}
package com.suntown;

import org.elasticsearch.script.Scorescript;
import org.elasticsearch.script.scriptContext;
import org.elasticsearch.script.scriptEngine;
import org.elasticsearch.script.Updatescript;

import java.util.Map;
import java.util.Set;

public class MyExpertscriptEngine implements scriptEngine{

    @Override
    public String getType() {
        return "myscript";
    }

    @Override
    public  FactoryType compile(String scriptName, String scriptSource, scriptContext scriptContext, Map map) {
        Updatescript.Factory factory = new UserUpdateFactory(scriptName,scriptSource);
        return scriptContext.factoryClazz.cast(factory);
    }

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


}

package com.suntown;

import org.elasticsearch.script.Updatescript;

import javax.script.scriptEngine;
import javax.script.scriptEngineManager;
import javax.script.scriptException;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.HashMap;
import java.util.Map;

public class UserUpdateFactory implements Updatescript.Factory{
    PrintStream ps = null;

    static int counter = 0;
    private String scriptName;
    private String scriptSource;
    private Map globalMap = new HashMap<>();

    public UserUpdateFactory(String _scriptName,String _scriptSource){
        this.scriptName = _scriptName;
        this.scriptSource = _scriptSource;

        String userdir = System.getProperty("user.dir");
        try{
            ps = new PrintStream(new FileOutputStream(userdir + "\logs\update.log",true));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        engine.put("ps",ps);
        engine.put("userdir",userdir);
    }

    scriptEngineManager sem = new scriptEngineManager();
    scriptEngine engine = sem.getEngineByName("javascript");

    @Override
    public Updatescript newInstance(Map params, Map ctx){
        counter++;
        return new Updatescript(params,ctx){

            @Override
            public void execute() {
                java.util.HashMap hashMap = (java.util.HashMap)ctx.get("_source");
                engine.put("owner",UserUpdateFactory.this);
                engine.put("row",hashMap);
                engine.put("rownum",counter);
                engine.put("thread",Thread.currentThread().getId());
                try{
                    engine.eval(UserUpdateFactory.this.scriptSource);
                } catch (scriptException e) {
                    e.printStackTrace();
                }
            }
        };
    }
}

将java代码编译后直接打包成普通的jar包,可以使用命令行

jar cvf es-user-scriptengine.jar

二.在elasticsearch中部署插件

1、切换到elasticsearch根目录,如 F:esesarches684-20220311elasticsearch-6.8.4

2、再切换到目录 F:esesarches684-20220311elasticsearch-6.8.4modules 并新建目录 es-user-scriptengine

3、将 文件 es-user-scriptengine.jar 复制到 目录 F:esesarches684-20220311elasticsearch-6.8.4modules下 并新建配置文件 plugin-descriptor.properties,如下图所示

 

plugin-descriptor.properties 文件可从modules 目录下的其它插件子目录下拷贝过来进行修改,

主要修改上图中classname=com.suntown.UserscriptEnginePlugin  这个类就是上述 es-user-scriptengine.jar 中的类

修改完成之后、重启elasticsearch服务

三.使用postman测试插件功能

1.切换到目录 F:esesarches684-20220311elasticsearch-6.8.4bin,运行 elasticsearch-sql-cli.bat

此时索引 zyzkwjj 中 还没有 列 rownum2

2.postman请求如下图

上图中的 "lang":"myscript" 即对应 类 com.suntown.MyExpertscriptEngine中getType()方法的返回值

 

3. 再使用 elasticsearch-sql-cli 查看索引zyzkwjj中的rownum2字段

发现rownum2确实更新成了从1开始递增的自增里额。

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/775351.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号