es6不支持native
插件开发中会有一些变化
需要实现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" } } } } } }
原文:https://www.cnblogs.com/wfox111/p/11143495.html