概述
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