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;

参考

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 5个常用的MySQL数据库管理工具_SQL工具

    5个常用的MySQL数据库管理工具_SQL工具原文:http://www.techxue.com/techxue-11898-1.html如今,Web应用程序的响应速度是成功的关键法宝之一。它与用户互动,用户对网站的看法,甚至谷歌网站排名情况都有着密不可分的关系。数据库性能是响应速度最重要的因素之一,一旦出错,所有程序都将会宕机。工欲善其事,必先利其器。几乎每一个Web开发人员都有一个最钟爱的MySQL管理工具,它帮助开发人员在许

    2022年8月22日
    5
  • HTTP.sys漏洞验证及防护[通俗易懂]

    HTTP.sys漏洞验证及防护[通俗易懂] 使用发包工具构造http请求包检测以fiddler工具为例,构造如下图的请求包:1GEThttp://192.168.174.145/HTTP/1.12Host:192.168.174.1453Range:bytes=0-184467440737095516154Connection:keep-alive5Cache-Control:max-age=06A…

    2022年7月18日
    27
  • RocketMQ原理解析

    RocketMQ原理解析1 NameServer 名称服务 NameServer 是没有状态的 即 NameServer 中的 Broker 和 topic 等状态信息 通过其他角色上报获取 都是保存在内存中的 不会持久化存储 可通过配置实现 集群可以横向扩展 主要功能如下 a 接收 Broker master 和 slave 启动时的注册路由信息 b 为 producer 和 consumer 提供路由服务 即通过 topic 名字获取所

    2025年6月26日
    2
  • ireport使用教程视频_proe拖动图形

    ireport使用教程视频_proe拖动图形iReport使用教程【原创】iReport与JasperReport简介1.1  简介JasperReport是报表的引擎部分,界面设计是用iReport。为什么选择这两个软件呢?因为这两个软件都是开源的,即免费的(虽然某些文档收费,但是磨灭不了我们使用它的理由)。JasperReport是一个报表制作程序,用户按照它制定的规则编写一个XML文件,然后得到用户需要输出的

    2025年10月23日
    4
  • Mac安装pycharm,绑定anaconda3[通俗易懂]

    Mac安装pycharm,绑定anaconda3[通俗易懂]1、首先安装anaconda3(当然使用3啦,除非给自己找麻烦装2)进入官网,https://www.anaconda.com/distribution/,选择系统和版本、下载,傻瓜式安装,结束后,控制台输入:conda–version,输出版本号,表示安装成功。2、安装pycharm进入官网,https://www.jetbrains.com/pycharm/download/…

    2022年8月28日
    7
  • How do I obtain a Digital Certificate from my Certificate Authority (CA)?

    How do I obtain a Digital Certificate from my Certificate Authority (CA)?

    2021年6月20日
    97

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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