在es6.1.1中编写自定义的script 先编写一个自定义类继承Plugin实现ScriptPlugin
package org.elasticsearch.script;
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();
}
}
然后再实现MyscriptEngine()方法 注意其中的"myscript"和"piece_func"在java api中的调用方法和在查询语句中的调用方法
package org.elasticsearch.script;
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;
public class MyscriptEngine implements ScriptEngine {
private final static Logger logger = LogManager.getLogger(MyscriptEngine.class);
@Override
public String getType() {
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 + "]");
}
if("piece_func".equals(scriptSource))
{
SearchScript.Factory factory = (p, lookup) -> new SearchScript.LeafFactory()
{
final int day1 = p.containsKey("param1")?(int)p.get("param1"):7;
final int day2 = p.containsKey("param2")?(int)p.get("param2"):30;
@Override
public SearchScript newInstance(LeafReaderContext context) throws IOException
{
return new SearchScript(p, lookup, context)
{
@Override //再获取source_字段然后比较返回分数
public double runAsDouble()
{
//获取原文档的分数 或者获取原文档的其他字段 比如time 字段
origin_score=lookup.source().get("time");
这里进行自己的打分逻辑
return result;
}
};
}
@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
}
}
java api 调用 注意script()的参数对应 lang:myscript isorCode:piece_func
Map<String, Object> params = new HashMap<>();
//这里传参数给params
params.put();
params.put();
//注意这里Script中的写法
Script script = new Script(ScriptType.INLINE,"myscript","piece_func",params);
ScriptScoreFunctionBuilder sb2= new ScriptScoreFunctionBuilder(script);
FunctionScoreQueryBuilder funcquery=QueryBuilders.functionScoreQuery(queryBuilder,sb2);
查询语句的使用 注意source 和lang 的对应
"script_score": {
"script": {
"source": "piece_func",
"lang": "myscript",
"params": {
"param1": "",
"param2":""
}
}
}