首页 > 代码库 > elasticsearch系列(七)java定义score

elasticsearch系列(七)java定义score

概述

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.写配置文件

配置文件格式参考

https://github.com/elastic/elasticsearch/blob/master/buildSrc/src/main/resources/plugin-descriptor.properties

 

4.上传到ES集群

在$ELASTICSEARCH_HOME/plugins新建一个文件夹,这个文件夹的名称就是这个插件的名称,

例如有 三个文件夹

技术分享

可以通过如下命令找到他们

 技术分享

在新建的文件夹中,导入jarplugin-descriptor.properties文件(必须有)

 

5.重启ES服务

kill -9 pid

nohup ./elasticsearch & 

 

5.使用

{

  "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

https://www.elastic.co/guide/en/elasticsearch/reference/5.2/query-dsl-function-score-query.html#function-script-score

 

6.更新插件

由于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

 

elasticsearch系列(七)java定义score