五、修改算分提升匹配度
5.1、function_score
假设我们的原始查询语句如下
GET zfc-doc-000001/_search
{
"query": {
"match": {
"content": "es"
}
}
}返回结果如下,ID为6的排在了第一位

如果我们想让ID为4的排在第一位如何修改查询语句呢,那么我们可以使用function_score来增加权重算分,比如使用title中匹配Elasticsearch的
此处是为举例,要学习思想,以后工作中才有更好的思路
修改之后的查询语句如下
GET zfc-doc-000001/_search
{
"query": {
"function_score": {
"query": {
"match": {
"content": "es"
}
},
"functions": [
{
"filter": {
"term": {
"title": "Elasticsearch"
}
},
"weight":2
}
],
"score_mode": "multiply",
"boost_mode": "multiply"
}
}
}可以看到,显示结果已经发生改变,ID为4的算分已经高于ID为6的算分了

其中,query参数用于指定正常的查询语句,functions参数用于定义一个或多个函数来修改文档得分
score_mode和boost_mode是用于控制function_score查询中如何计算文档得分和如何影响文档的排名的参数。
score_mode:参数用于指定多个函数如何组合计算得分。它支持以下取值:
multiply: 将所有函数的得分相乘sum: 将所有函数的得分相加avg: 将所有函数的得分求平均值max: 取所有函数的最大得分作为文档得分min: 取所有函数的最小得分作为文档得分first: 取第一个函数的得分作为文档得分weighted_sum: 将所有函数的得分相加,并乘以给定的权重系数。
boost_mode参数用于指定得分如何影响文档的排名。它支持以下取值:
multiply: 将得分与文档的原始得分相乘replace: 使用得分替换文档的原始得分sum: 将得分与文档的原始得分相加avg: 将得分与文档的原始得分求平均值max: 取得分和文档的原始得分的最大值作为文档得分min: 取得分和文档的原始得分的最小值作为文档得分
请注意,score_mode和boost_mode参数的取值会影响文档得分和排名的计算方式,需要根据具体的需求来选择合适的取值。另外,function_score查询中可以定义多个函数来修改文档得分,也可以使用weight函数来给定固定的分值,这些函数的组合和参数设置可能会对结果产生重要影响。
除了使用上述方式外,还可以使用如下几种方式进行算分的修改
5.2、Boosting
如下是匹配content字段中包含es的,对content中包含es的进行减分
GET zfc-doc-000001/_search
{
"query": {
"boosting": {
"positive": {
"term": {
"content": "es"
}
},
"negative": {
"term": {
"content": "玩转"
}
},
"negative_boost": 0.5
}
}
}5.3、Field Value Factor
需要注意的是,
field_value_factor函数用于根据字段的数值进行打分计算,要求字段是数值类型的。
我们使用Field Value Factor来根据字段agreeNum的值对包含ES关键词的文档进行加权。使用log1p修饰符可以将字段值的对数应用于计算
GET zfc-doc-000001/_search
{
"query": {
"match": {
"content": "ES"
}
},
"sort": [
{
"_score": {
"order": "desc"
}
}
]
}
GET zfc-doc-000001/_search
{
"query": {
"function_score": {
"query": {
"match": {
"content": "ES"
}
},
"field_value_factor": {
"field": "agreeNum",
"factor": 0.1,
"modifier": "log1p"
}
}
},
"sort": [
{
"_score": {
"order": "asc"
}
}
]
}其中field_value_factor的参数含义如下
field: 要计算得分的字段名factor: 一个乘数,用于缩放字段值的影响。可以使用任何非负数值。假如factor的值是 0.1,表示字段值的影响将会被减小modifier: 一个修饰符,用于对数值进行修改以调整得分
none:不应用任何修饰符,默认情况下为1log:对计算结果取对数,以减少较大值的影响log1p:与log类似,但在计算结果前先加1,可以避免对0值进行对数运算
5.4、Script Score
我们可以使用script_score来自定义计算得分,此处仅为示例,具体可以根据自己的业务来修改。具体计算分可以通过explain来查看验证
GET zfc-doc-000001/_search
{
"explain": true,
"query": {
"function_score": {
"query": {
"match": {
"content": "es"
}
},
"script_score": {
"script": {
"source": "Math.log(doc['agreeNum'].value + 10)"
}
}
}
}
}5.5、Decay Functions
我们使用Gauss衰减函数根据字段createTime的值来衰减文档的得分。在这个例子中,以2022-12-01为中心,每过10天,得分将衰减一半。参考结果可以使用下面两个查询语句对应
GET zfc-doc-000001/_search
{
"query": {
"match": {
"content": "es"
}
}
}
GET zfc-doc-000001/_search
{
"query": {
"function_score": {
"query": {
"match": {
"content": "es"
}
},
"functions": [
{
"gauss": {
"createTime": {
"origin": "2022-12-01",
"scale": "10d"
}
}
}
]
}
}
}