es painless 排序_Elasticsearch中使用painless实现评分「建议收藏」

使用Elasticsearch(ES)作为搜索引擎时我们常常需要根据文档的属性值自定义它们的排序,为用户提供高质量的搜索结果。以下内容已在ElasticSearch7.1.1Linux集群中测试。ES中的rest_api中提供了自定义评分选项,分别为function_score下的function_script和script_score。其中function_score可以用于简单的评分需…

大家好,又见面了,我是你们的朋友全栈君。

使用Elasticsearch(ES)作为搜索引擎时我们常常需要根据文档的属性值自定义它们的排序,为用户提供高质量的搜索结果。

以下内容已在 ElasticSearch 7.1.1 Linux 集群中测试。

ES中的rest_api中提供了自定义评分选项,分别为function_score下的function_script和script_score。其中function_score可以用于简单的评分需求,但是当我们要加入文档PageRank的影响,加入时间衰减因子,且根据文档类型给予不同的乘法因子等,简单的function_script就无能为力了;而script_score,也就是本文将介绍的内容,可以用于满足复杂的,高度定制化的评分需求。

painless语言可以采用动态隐式类型声明,类似groovy的语法,如:

def i = 1;

也可以使用静态显式类型,类似Java的语法:

int i = 1;

基于明确好于隐式的原则,接下来实例中采用强类型的Java语法。

Java ES前端代码:

/**这里的script-id为我们通过ES的_scripts API储存在ES集群中的值一下为Kibana devtools中更新和获取最新值方法,更新实时生效下次请求就会有最新的排序结果更新方法(script-id是自已定的script的名字):POST _scripts/script-id{“script”: {“lang” : “painless”,”source” : “// Your script score code here “}}获取方法:GET _scripts/script-id*/

// 在Java 中使用stored script_score:Map scriptParams = new HashMap() {

private static final long serialVersionUID = 1L;

{

put(“now”, new Date().toInstant().toEpochMilli());

}

};

Script script = new Script(ScriptType.STORED, null, “script-id”, scriptParams);

ScriptScoreFunctionBuilder scriptScoreBuilder = ScoreFunctionBuilders.scriptFunction(script);

FunctionScoreQueryBuilder functionScoreBuilder = QueryBuilder

.functionScoreQuery(/* originalBuilder */, scriptScoreBuilder)

.boostMode(CombineFunction.REPLACE);

painless示例,在下面的脚本中我们用painless脚本实现了等价于内置高斯衰减的函数

// params、_score和doc是特殊变量

// params用来获取在(Java)代码中生成得到的值,// 如new Date()long now = params[‘now’]; // 从params获取now变量的值,这个值在每次接受请求时 // 由Java生成,比如:new Date().toInstant().toEpochMilli() // 处于安全考虑,painless中不允许new Date()的使用。

// _score是当前文档的BM25评分。// 以下painless代码实现了获取当前时间和根据当前时间更新评分。

// doc是当前文档// 可以通过doc[‘SomeProp’]获取文档的SomeProp属性的包装对象// 通过doc[‘SomeProp’].value获取文档的SomeProp属性真实值

// 假设索引中有类型为Date的pubDate字段,记录的文档的发表时间。// 用doc[‘pubDate’].value获取值long docTime = doc[‘pubDate’].value.toInstant().toEpochMilli();

long docVal = now – docTime;

long year = 1000L * 3600 * 24 * 365; // year in milliseconds

long gaussScale = year * 1.5;

long gaussOffset = year * 0;

double gaussDecay = 0.5;

double sigmaSquare = – (Math.pow(gaussScale, 2) / (2 * Math.log(gaussDecay)));

double gaussMultiplier = Math.exp(-1 * Math.pow(Math.max(0, Math.abs(docTime – now) – gaussOffset), 2) / 2 / sigmaSquare);

return _score * gaussMultiplier;

参考

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/126362.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • webstorm激活码最新2021【2021最新】

    (webstorm激活码最新2021)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • cad怎样生成轮廓线(图样中可见轮廓线用什么线)

    一般在做影像处理时,为提升效率,常会将影像转为二值影像后再进行处理。在EmguCV内有许多找轮廓线的方法,但是随着版本更新,不同版本的函数不见得会一样,每次都要重新查询实在很麻烦,那不如把他们记下来。版本概要:EmguCV版本:3.2.0.2682编译器版本:VisualStudio2017Community方案平台:x64(许多导致程式无法执行的原因是因为没有改执

  • 所谓齐次坐标就是用_什么叫齐次

    所谓齐次坐标就是用_什么叫齐次目录[第一篇:关于齐次坐标的理解(经典)](https://blog.csdn.net/janestar/article/details/44244849)[第二篇:齐次坐标的理解](http://www.cnblogs.com/csyisong/archive/2008/12/09/1351372.html)[第三篇:如何通俗的解释仿射变换?](https://www.matongxue.co…

    2022年10月26日
  • 助臂_有所臂助

    助臂_有所臂助第十章助臂  一个好汉三个帮,程序员同样如此。  我怀着异样的心情去了天龙。也许是ANGEL的出现感染了我,给我感觉到了压迫,我比往常更努力的投入到工作中去,我必须尽快完成眼前这个工程,然后全心投入到智能杀毒软件的研究中去。  思考再三后,我还是把DENNIS信里的内容告诉了李珏和赵思聪,他两当场就被震住了。  “真的可能写出智能化的病毒吗?”赵思聪不可思议的问道。  我点了点头,无奈的说道:

  • WPF 使用TextBox做密码输入框

    WPF 使用TextBox做密码输入框密码输入框需要输入的密码不能显示明文,用其他的特殊字符代替显示。显示效果如下:Xaml部分代码如下:

    2022年7月25日
  • 光纤交换机如何划分zone[通俗易懂]

    光纤交换机如何划分zone[通俗易懂]说明:1.不同厂商的光纤交换机zone的划分类似,所以只要掌握了一种其他则可以触类旁通。2.如果想使用图形界面对光纤交换机划分zone,在pc端必须安装javawebstart,初次访问阵列它会提示下载地址。一.规划在对光纤交换机进行设置前,一定要做好相应的规划,比如那些端口要连接主机,那些端口要连接阵列,考虑到减少“乒乓效应”及平衡负载,当我们划分zone时最好用一对一关系,即一个zone只接一个主机一个阵列,而不是划分一个大的zone阵列主机都插…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号