Featured image of post ElasticSearch 中使用衰减函数来完美你的搜索结果

ElasticSearch 中使用衰减函数来完美你的搜索结果

函数衰减使你的排序更加完善

最近的项目在原有的搜索需求增加功能

  • ElasticSearch 7.6 (请注意,大版本不同可能参数不同)

原有搜索:简单的标题+正文 全文索引
新加功能:在原有的基础上,更加完善排序结果。可以由多种因素控制。发布时间(发布太久的了得分需下降)后台给予的权重值(权重值越高越好)热度

调研了一下文档,发现ElasticSearch完美支持这样的需求,只需要自己定义好递减函数即可。

ES 内置了衰减函数(Decay Function)的支持。对于数值、日期和地理位置类型,可以设置一个理想的值,如果实际的值越偏离这个理想值(无论是增大还是减小),就越不符合期望,分数就越低。

它支持如下参数:

  • origin:原点,该字段最理想的值,这个值可以得到满分(1.0)
  • offset:偏移量,与原点相差在偏移量之内的值也可以得到满分
  • scale:衰减规模,当值超出了原点到偏移量这段范围,它所得的分数就开始进行衰减了,衰减规模决定了这个分数衰减速度的快慢
  • decay:衰减值,该字段可以被接受的值(默认为 0.5),相当于一个分界点,具体的效果与衰减的模式有关

  • linear 直线衰减,在 0 分外的值都是 0 分
  • exp 衰减速度先快后慢
  • gauss 衰减速度先慢后快再慢

我的参数配置如下:

{
    "query":{
        // 使用得分函数
        "function_score":{
            // 查询的关键字
            "query":{
                "multi_match":{
                    // 关键字
                    "query":"博客",
                    // title 的权重是 body 的 "10"倍,具体可自行查阅官方文档的计算方式
                    "fields":[
                        "title^10",
                        "body"
                    ]
                }
            },
            // 函数得分如何作用于原始得分(这里是相乘)
            "boost_mode":"multiply",
            // 函数的总得分(现在是所有得分累加)
            "score_mode":"sum",
            "functions":[
                // 使用高斯函数, 原始日期是 2020-04-27
                // 距离原始日期 30 天之内的都能得到满分(以前未来日期都算),也就是 1
                // 距离原始日期 30 ~ 90 天的使用高斯函数得分
                // 距离原始日期超过 90(30+60) 的都得最低分,也就是 0.5
                {
                    "gauss":{
                        "created_date":{
                            "origin":"2020-04-27",
                            "offset":"30d",
                            "scale":"60d",
                            "decay":0.5
                        }
                    },
                    "weight": 1
                },
                // 使用线性函数,所有参数和高斯一致,只不过衰减程度不一样
                // 值的注意的是线性函数有可能得 0{
                    "linear":{
                        "hot_value":{
                            "origin":100,
                            "offset":10,
                            "scale":50,
                            "decay": 0.5
                        }
                    },
                    // 可设置函数的权重
                    "weight": 2
                }
            ]
        }
    }
}

引用文档:
https://www.elastic.co/guide/en/elasticsearch/reference/7.6/query-dsl-function-score-query.html
知乎Live全文搜索之使用Elasticsearch全文搜索