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)


相关推荐

  • rehash过程_contenthash

    rehash过程_contenthash步骤1)首先创建一个比现有哈希表更大的新哈希表(expand)2)然后将旧哈希表的所有元素都迁移到新哈希表去(rehash)dictAdd对字典添加元素的时候,_dictExpandIfNeeded会

  • adb shell getenforce/setenforce(三级命令)

    adb shell getenforce/setenforce(三级命令)adbshellgetenforceadbshellsetenforce

  • Flume学习笔记「建议收藏」

    Flume学习笔记「建议收藏」Flume学习笔记Flume定义Flume基础架构Flume安装部署监控端口数据实时监控单个追加文件实时监控目录下多个新文件Flume定义Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构,灵活简单.Flume最主要的作用就是:实时读取服务器本地磁盘的数据,将数据写入到HDFS.Flume基础架构AgentAgent是一个JVM进程,它以事件的形式将数据从源头送至目的。Agent主要有3个部

  • 小白都能看懂 XAMPP的下载安装配置详细教程(含拒绝访问坑)[通俗易懂]

    小白都能看懂 XAMPP的下载安装配置详细教程(含拒绝访问坑)[通俗易懂]话不相瞒,当初为了在xampp里面配置phpwind,我在卸载与安装之间来回了不下10次,而且我可能招坑体质,回想起来真是一把泪了。但是我的phpwind始终还是安装不成功,真的很无奈。最终,byebye了您。废话不说,直接干了。文章目录一、下载(三步)第一步:找对应的操作系统版本第二步:选一个迭代版本第三步:找到安装包二、安装三、配置第一步:配置Apace第一个文件(httpd.conf),需要修改两个地方。第二个文件(http-ssl.conf),需修改三个地方。第二步:配置MySQL第三步:配置S

  • 对数的计算公式[通俗易懂]

    对数的计算公式[通俗易懂]性质编辑①;②;③负数与零无对数.④*=1;恒等式及证明a^log(a)(N)=N(a>0,a≠1)推导:log(a)(a^N)=N恒等式证明在a>0且a≠1,N>0时设:当l

  • 构建高并发高可用的电商平台架构实践[通俗易懂]

    构建高并发高可用的电商平台架构实践[通俗易懂]各个维度总结电商平台中的高并发高可用的架构实践,从架构设计的理念到平台的逻辑架构,以及到平台架构中各个模块的介绍

发表回复

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

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