首页 > 其他 > 详细

elasticsearch6 插件开发变动

时间:2019-07-06 18:38:02      阅读:294      评论:0      收藏:0      [点我收藏+]

es6不支持native

插件开发中会有一些变化

官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/6.0/modules-scripting-engine.html?nsukey=TC4GNoi7V8SGUZSDocHVHesIeUCTyhBXqud%2BLvKwpuJmmkljLok8itiwuQawSXefZ9Jpy09GCSbKtUBSmTNs6IZmoH9wYePp4zb6Mr1IoS6gopicq56c%2FhIsnXM4x3UAmj%2FklieHp%2FlnSv4iQTTGgeHr%2BO5Cvh0c7bXINcqWxuNMZhPnVzEM5otr8g9JfQRpFEZ0Rq20ffXo36Usc3Ki7Q%3D%3D

 

需要实现ScriptEngine接口

插件入口

package com.esplugin.demo;

import java.util.Collection;

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;

public class DemoPlugin extends Plugin implements  ScriptPlugin {

    @Override
    public ScriptEngine getScriptEngine(Settings settings, Collection<ScriptContext<?>> contexts) {
        return new MyScriptEngine();
    }


}

 

其中getType方法中return的就是script的lang;插件名称在complile中用if判断,scriptSource为插件名称,执行插件逻辑

package com.esplugin.demo;

import java.io.IOException;
import java.util.Map;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.lucene.index.LeafReaderContext;
import org.elasticsearch.script.ScriptContext;
import org.elasticsearch.script.ScriptEngine;
import org.elasticsearch.script.SearchScript;

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

    @Override
    public String getType() {
        //return "demoPlugin"; // script name
        return "myscript";
    }

    @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());
        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("this is first value : {} ,second : {} ", first, second);
        if("demoPlugin".equals(scriptSource)){
            SearchScript.Factory factory = (p, lookup) -> new SearchScript.LeafFactory() {
                final String field = p.containsKey("field")?(String)p.get("field"):"";
                final String text = p.containsKey("text")?(String)p.get("text"):"";
                @Override
                public SearchScript newInstance(LeafReaderContext context) throws IOException {
                    return new SearchScript(p, lookup, context) {
                        @Override
                        public double runAsDouble() {
                            final String test = (String) lookup.source().get(field);
                            if (test.indexOf(text) >= 0){
                                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
    }
}

  查询如下,lang中为getType中的renturn值,source为插件名,params为参数

GET index/_search
{
"query": { "function_score": { "query": { "match_all": {} }, "script_score": { "script": { "source": "demoPlugin", "lang": "myscript", "params": { "field": "test", "text": "1" } } } } } }

 

elasticsearch6 插件开发变动

原文:https://www.cnblogs.com/wfox111/p/11143495.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!