最近的项目在原有的搜索需求增加功能
* ElasticSearch 7.6 (请注意,大版本不同可能参数不同)
原有搜索:简单的标题+正文 全文索引
新加功能:在原有的基础上,更加完善排序结果。可以由多种因素控制。发布时间(发布太久的了得分需下降)后台给予的权重值(权重值越高越好)热度
调研了一下文档,发现ElasticSearch完美支持这样的需求,只需要自己定义好递减函数即可。
ES 内置了衰减函数(Decay Function)的支持。对于数值、日期和地理位置类型,可以设置一个理想的值,如果实际的值越偏离这个理想值(无论是增大还是减小),就越不符合期望,分数就越低。
它支持如下参数:
origin
:原点,该字段最理想的值,这个值可以得到满分(1.0)offset
:偏移量,与原点相差在偏移量之内的值也可以得到满分scale
:衰减规模,当值超出了原点到偏移量这段范围,它所得的分数就开始进行衰减了,衰减规模决定了这个分数衰减速度的快慢decay
:衰减值,该字段可以被接受的值(默认为 0.5),相当于一个分界点,具体的效果与衰减的模式有关
* linear
直线衰减,在 0 分外的值都是 0 分
* exp
衰减速度先快后慢
* gauss
衰减速度先慢后快再慢
我的参数配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
{ "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全文搜索