IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 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<ScriptContext<?>> 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> FactoryType compile(String scriptName, String scriptSource, ScriptContext<FactoryType> scriptContext, Map<String, String> 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<String,String> 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<String, Object> params, Map<String, Object> 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:\esesarch\es684-20220311\elasticsearch-6.8.4

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

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

?

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

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

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

三.使用postman测试插件功能

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

此时索引 zyzkwjj 中?还没有 列 rownum2

2.postman请求如下图

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

?

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

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

?

?

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-24 00:37:48  更:2022-03-24 00:40:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:02:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码