概述
ES支持groovy 和 java两种语言自定义score的计算方法,groovy甚至可以嵌套在请求的参数中,有点厉害,不过不在本篇讨论范围。
如何用自定义的java代码来定义score如何产生,这用到了ES的插件功能
关于es插件的相关操作,可以通过以下命令获得
./bin elasticsearch-plugn –h
操作步骤
1.增加配置
首先需要在ES的配置中增加以下,
旧版本是
script.disable_dynamic: false
目前用的ES是5.2.2,根据日志提示,改成如下,改完后需要重启ES
script.inline: true
script.stored: true
不得不说这个日志提供的信息真不错
如果不加这两条配置,则会这样这种错误
2.写java代码
//java代码格式参考
https://www.elastic.co/guide/en/elasticsearch/reference/5.2/modules-scripting-native.html
3.写配置文件
配置文件格式参考
4.上传到ES集群
在$ELASTICSEARCH_HOME/plugins新建一个文件夹,这个文件夹的名称就是这个插件的名称,
例如有 三个文件夹
可以通过如下命令找到他们
在新建的文件夹中,导入jar包和plugin-descriptor.properties文件(必须有)
5.重启ES服务
kill -9 pid
nohup ./elasticsearch &
6.使用
{ "query": { "function_score": { "query": { "match": { "your_fields": "xxxx" } }, "functions": [ { "script_score": { "script": { "inline": "key", "lang": "native", "params": { "your_fields": "xxxxx" } } } } ] } } }
key解释:
Key | 解释 | 备注 |
inline | 调用插件的key,和插件名称是两个东西 | 在NativeScriptFactory接口中的 getName()方法设置 |
lang | 自定义方式 | native意思是用java原生实现 |
//关于自定义function-script-score
7.更新插件
由于ES集群会缓存插件代码,就算把插件删了依然可用,目前还是需要重启来更新插件
参考资料
//自定义java制作插件必要的步骤
https://www.elastic.co/guide/en/elasticsearch/plugins/5.2/plugin-authors.html#_plugin_structure
//github完整插件
https://github.com/momoxixi/elasticsearch-feature-vector-scoring