自定义Elasticsearch本地脚本

使用本地代码

实现本地脚本

  • 集成抽象类AbstractSearchScript
  • 参考代码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public class HashCodeSortScript extends AbstractSearchScript {
    private String field = "name";
    public HashCodeSortScript(Map<String,Object> params){
    if(params!=null && params.containsKey("field")){
    this.field = params.get("field").toString();
    }
    }
    @Override
    public Object run() {
    Object value = source().get(field);
    if(value!=null){
    return value.hashCode();
    }
    return 0;
    }
    }

和其他脚本一样,这里也可以使用source(),doc(),fields()等得到文档内容.

实现脚本工厂

  • 实现NativeScriptFactory接口,返回自定义的本地脚本对象
  • 参考代码:
    1
    2
    3
    4
    5
    6
    7
    public class HashCodeSortNativeScriptFactory implements NativeScriptFactory {
    @Override
    public ExecutableScript newScript(@Nullable Map<String,Object> params){
    return new HashCodeSortScript(params);
    }
    }

安装脚本

  • 编辑打包脚本为jar文档
  • 把打包好的jar文档放在Elasticsearchlib目录
  • 注册脚本,两种方法,使用Setting API调用来实现或在elasticsearch.yml配置文件中添加一行,这里我们修改elasticsearch.yml文件,代码如下:
    1
    2
    script.native.native_sort.type:
    pl.solr.elasticsearch.example.scripts.HashCodeSortNativeScriptFactory

注意native_sort部分,这个部分定义了脚本名称,使用时作为参数传递给script部分

  • 重启Elasticsearch.

执行脚本示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"query":{
"match_all" : {}
},
"sort" : {
"_script" : {
"script" : "native_sort",
"params" : {
"field" : "otitle"
},
"lang" : "native",
"type" : "string",
"order" : "asc"
}
}
}

文章参考

  • Elasticsearch服务器开发(第二版)