• Elasticsearch:使用 function_score 中的weight和gauss衰减函数定制搜索结果的分数


    👏作者简介:大家好,我是Rockey,不知名企业的不知名Java开发工程师
    🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
    📝联系方式:he18339193956,加我进群,大家一起学习,一起读书,一起对抗互联网寒冬👀

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 点击跳转浏览。
         今天有一个需求是按照先是未处理,已处理,处理中来进行排序,先显示未处理的事情,然后已处理和处理中的放在后面,并且是当检索框选择了截止时间之后,按照截止进行排序,并且之前的未处理和处理中的顺序不发生改变。
    思路:
         这个其实先考虑未处理处理中和截止时间之间的排序关系。这个可以通过function_score 中的weight加强函数来进行排序,可以给未处理赋予最大的权重,截止时间次大,之后的未处理和处理中权重最小
    截止时间那个排序可以通过function_score 中的衰减函数gass函数来进行排序,距离截止时间越远,得分越低。
    这样的话就可以实现先按照未处理大的排序逻辑,之后按照截止时间进行排序

         这里衰减函数默认的话是按照当前时间为原点,然后进行衰减的

    function_score支持的衰减函数有三种,分别是 linear、exp 和 gauss

    linear、exp、gauss三种衰减函数的差别只在于衰减曲线的形状,在DSL的语法上的用法完全一样

    • linear : 线性函数是条直线,一旦直线与横轴0香蕉,所有其他值的评分都是0
    • exp : 指数函数是先剧烈衰减然后变缓
    • guass(最常用) : 高斯函数则是钟形的,他的衰减速率是先缓慢,然后变快,最后又放缓


    在这里插入图片描述
    衰减函数们 (linear、exp、gauss) 支持的参数

    • origin : 中心点,或是字段可能的最佳值,落在原点(origin)上的文档评分_score为满分1.0,支持数值、时间 以及
      “经纬度地理座标点”(最常用) 的字段
    • offset : 从 origin
      为中心,为他设置一个偏移量offset覆盖一个范围,在此范围内所有的评分_score也都是和origin一样满分1.0
    • scale : 衰减率,即是一个文档从origin下落时,_score改变的速度
    • decay : 从 origin 衰减到 scale 所得的评分_score,默认为0.5 (一般不需要改变,这个参数使用默认的就好了)

    以上面的图为例

    • 所有曲线(linear、exp、gauss)的origin都是40,offset是5,因此范围在40-5 <= value <=
      40+5的文档的评分_score都是满分1.0
    • 而在此范围之外,评分会开始衰减,衰减率由scale值(此处是5)和decay值(此处是默认值0.5)决定,在origin +/-
      (offset + scale)处的评分是decay值,也就是在30、50的评分处是0.5分
    • 也就是说,在origin + offset + scale或是origin - offset -
      scale的点上,得到的分数仅有decay分

         这里衰减函数默认的话是按照当前时间为原点,然后进行衰减的,所以我们设置默认按照当前事件的前100天为原点,来开始得分衰减,并且是按照秒来进行衰减,这样的话就可以实现按照截止时间来进行排序
    参考http://www.javashuo.com/article/p-syxxtytd-ka.html
    https://www.cnblogs.com/yinjihuan/p/13570778.html这两篇打分博客

    function_scroe其他辅助的参数

    boost_mode : 决定 old_score 和 加强score 如何合併

    • multiply(默认) : new_score = old_score * 加强score
    • sum : new_score = old_score + 加强score
    • min : old_score 和 加强score 取较小值,new_score = min(old_score, 加强score)
    • max : old_score 和 加强score 取较大值,new_score = max(old_score, 加强score)
    • replace : 加强score直接替换掉old_score,new_score = 加强score

    score_mode : 决定functions裡面的加强score们怎麽合併,会先合併加强score们成一个总加强score,再使用总加强score去和old_score做合併,换言之就是会先执行score_mode,再执行boost_mode

    • multiply (默认)
    • sum
    • avg
    • first : 使用首个函数(可以有filter,也可以没有)的结果作为最终结果
    • max
    • min

    java代码如下:用的weightFactorFunction和gaussDecayFunction

        GaussDecayFunctionBuilder dateGaussDecayFunctionBuilder=ScoreFunctionBuilders.gaussDecayFunction("截止时间",time , "100d", "0s").setWeight(10);
            FunctionScoreQueryBuilder.FilterFunctionBuilder[] filterFunctionBuilders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
                    new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.prefixQuery("未处理,), ScoreFunctionBuilders.weightFactorFunction(100)),
                    new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.prefixQuery(“处理中”), ScoreFunctionBuilders.weightFactorFunction(1)),
                    new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.prefixQuery(“已处理”), ScoreFunctionBuilders.weightFactorFunction(1)),
                    new FunctionScoreQueryBuilder.FilterFunctionBuilder(dateGaussDecayFunctionBuilder)
            };
    
            FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(filterFunctionBuilders).scoreMode(FiltersFunctionScoreQuery.ScoreMode.SUM);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    ScoreMode采用累加的方式

    官方文档https://www.elastic.co/guide/cn/elasticsearch/guide/current/decay-functions.html

    结语

    🔥一个人可以掌握知识,但只有与他人交流才能形成智慧。
    🔥One person can acquire knowledge, but wisdom is formed only in the exchange with others.
    📝 欢迎大家关注博主公众号 Rockey小何同学 添加博主微信:he18339193956进群,一起学习,一起成长,一起提高认知。
    🏆 我坚信人与人之间的差距是表面上是财富的差距,本质上是大脑中认知的差距,

    我们下期再见。

  • 相关阅读:
    Truncation Sampling as Language Model Desmoothing
    Docker 匿名卷、命名卷与绑定挂载
    数据库模式笔记 --- 如何在开发中选择合适的数据库+关系型数据库是谁发明的?
    软考整体管理思维导图
    监控易101:全方位解读运维的核心功能与特性
    jacoco单测报告怎么同步到sonarqube
    微擎模块 志汇周边优惠卡券小程序5.2开源版 带最新小程序前端
    支付分账户系统——新美业连锁的交易数字化破局之道
    android 系统rc添加 shell运行脚本
    每天一点python——day74
  • 原文地址:https://blog.csdn.net/he1234555/article/details/126453337