zoukankan      html  css  js  c++  java
  • Elasticsearch 排序插件的开发

    直接观察到的几个问题

    1. 简单expression脚本的执行效率 > java 插件,10000条数据可以测试出1ms左右的差距。
    2. Es会不断调用newScript来创建“足够多”的自定义脚本对象,来处理,不管数据量多还是少,应该有个初始值。所以本地有时候只有几条测试数据,它也会创建几十个自定义脚本对象,并不奇怪,这个我纠结了比较久,以为是代码有问题。

    数值类型问题

    官方有个demo,那个在java8 + es2.0 跑不起来的,主要问题就是这个数值类型。
    从source().get()得到的数据,和上传数据的时候json对象数据有关,而(float)强制转换可能失败。从doc().getValues()得到的数据有点不太一样,如果你设定float类型,会得到一个double类型。。。而不是float。尽量从doc()去取值,它会保证给的值是同一种。据说效率也好点。

    //插件执行的脚本
    package ******;
    
    import org.elasticsearch.script.AbstractDoubleSearchScript;
    import org.elasticsearch.index.fielddata.ScriptDocValues;
    
    public class Normal extends AbstractDoubleSearchScript {
    
        //"1 /( now - doc['dateline'] > 259200 ? ( now - doc['dateline'] ) / 259200 : 1)",
        @Override
        public double runAsDouble() {
            return ((ScriptDocValues.Doubles) doc().get("a")).getValue() / 123456;
        }
    }
    
    //工厂类
    
    package ***;
    
    import org.elasticsearch.common.Nullable;
    import org.elasticsearch.plugins.Plugin;
    import org.elasticsearch.script.*;
    
    import java.util.Map;
    import java.util.Timer;
    import java.util.TimerTask;
    
    public class myPlugins extends Plugin {
        @Override
        public String name() {
            return "my_normal";
        }
    
        @Override
        public String description() {
            return "my native script that does something great";
        }
    
        public void onModule(ScriptModule scriptModule) {
    
            scriptModule.registerScript("my_normal", MyNativeScriptFactory.class);
        }
    
        public static class MyNativeScriptFactory implements NativeScriptFactory {
    
            @Override
            public ExecutableScript newScript(@Nullable Map<String, Object> params) {
                return new Normal();
            }
    
            @Override
            public boolean needsScores() {
                return true;
            }
        }
    }
    

    就上面这个脚本,执行速度赶不上 expression:'doc['a'] / 123456'

  • 相关阅读:
    【转】 robotframework(rf)中对时间操作的datetime库常用关键字
    在RobotFramework--RIDE中把日期转化为整型进行运算
    Oracle中date转为timstam可以函数to_timestamp的方式来转化
    Java项目缺少.project文件
    数据库时间戳转换日期(MYSQL数据库)
    spring+struts+mybatis中关于报错org.hibernate.exception.GenericJDBCException: Connection is read-only. Queries leading to data modification are not allowed 的产生原因及解决方案
    新加字段问题(增加联合主键)
    集合问题
    数组面试题
    集合的问题
  • 原文地址:https://www.cnblogs.com/didda/p/5040046.html
Copyright © 2011-2022 走看看