elasticsearch 6.1.1编写脚本插件以及使用方法

在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":""
                  }
           }
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值