最近的项目在原有的搜索需求增加功能
- 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全文搜索