ElasticSearch - function_score (field_value_factor具体实例)

阅读本文需要先了解function_score的相关知识,请看 ElasticSearch - function_score详解

1. 数据准备

首先准备数据和索引,在ES插入三条数据,其中titletext类型,likeinteger类型(代表点赞量)。

{ "title": "ES 入门", "like": 2 }
{ "title": "ES 进阶", "like": 5 }
{ "title": "ES 最高难度", "like": 10 }

2. function_score (field_value_factor)示例

2.1 普通查询

先使用一般的query,查看普通的查询的评分会是如何:

GET 127.0.0.1/mytest/doc/_search
{
    "query": {
        "match": {
            "title": "ES"
        }
    }
}

"hits": [
    {
        "_score": 0.2876821,
        "_source": { "title": "ES 入门", "like": 2 }
    },
    {
        "_score": 0.20309238,
        "_source": { "title": "ES 进阶", "like": 5 }
    },
    {
        "_score": 0.16540512,
        "_source": { "title": "ES 最高难度", "like": 10 }
    }
]
2.2 function_score查询(field_value_factor)
2.2.1 field_value_factor

使用function_scorefield_value_factor改变_score,将old_score乘上like的值。

{
    "query": {
        "function_score": {
            "query": {
                "match": {
                    "title": "ES"
                }
            },
            "field_value_factor": {
                "field": "like"
            }
        }
    }
}

"hits": [
    {
        "_score": 1.6540513, //原本是0.16540512
        "_source": { "title": "ES 最高难度", "like": 10 }
    },
    {
        "_score": 1.0154619, //原本是0.20309238
        "_source": { "title": "ES 进阶", "like": 5 }
    },
    {
        "_score": 0.5753642, //原本是0.2876821
        "_source": { "title": "ES 入门", "like": 2 }
    }
]

本来 "ES最高难度" 的score0.16540512,经过field_value_factor的改变,乘上了那个文档中的like值(10)之后,新的score变为 1.6540513

2.2.2 max_boost

加上max_boost,限制field_value_factor的最大加强score

GET 127.0.0.1/mytest/doc/_search
{
    "query": {
        "function_score": {
            "query": {
                "match": {
                    "title": "ES"
                }
            },
            "field_value_factor": {
                "field": "like"
            },
            "max_boost": 3
        }
    }
}

"hits": [
    {
        "_score": 0.6092771, //原本是0.20309238
        "_source": { "title": "ES 进阶", "like": 5 }
    },
    {
        "_score": 0.5753642, //原本是0.2876821
        "_source": { "title": "ES 入门", "like": 2 }
    },
    {
        "_score": 0.49621537, //原本是0.16540512
        "_source": { "title": "ES 最高难度", "like": 10 }
    }
]

可以看到“ES入门”的加强score是2,在max_boost限制裡,所以不受影响。而“ES进阶”“ES最高难度”field_value_factor函数产生的加强score因为超过max_boost的限制,所以被设为3

2.2.3 field_value_factor中还支持 modifier、factor 参数

有时候线性的计算new_score = old_score * like值的效果并不是那麽好,field_value_factor中还支持 modifierfactor 参数,可以改变like值对old_score的影响。

modifier参数支持的值:

  • none : new_score = old_score * like值

    默认状态就是none,线性。
    在这里插入图片描述

  • log1p : new_score = old_score * log(1 + like值)

    最常用,可以让like值字段的评分曲线更平滑。
    在这里插入图片描述

  • log2p : new_score = old_score * log(2 + like值)

  • ln : new_score = old_score * ln(like值)

  • ln1p : new_score = old_score * ln(1 + like值)

  • ln2p : new_score = old_score * ln(2 + like值)

  • square : 计算平方

  • sqrt : 计算平方根

  • reciprocal : 计算倒数

factor参数:
factor作为一个调节用的参数,没有modifier那麽强大会改变整个曲线,他仅改变一些常量值,设置factor>1会提昇效果,factor<1会降低效果。假设modifierlog1p,那麽加入了factor的公式就是new_score = old_score * log(1 + factor * like值)
在这里插入图片描述

对刚刚的例子加上 modifierfactor参数的查询语句如下:

GET 127.0.0.1/mytest/doc/_search
{
    "query": {
        "function_score": {
            "query": {
                "match": {
                    "title": "ES"
                }
            },
            "field_value_factor": {
                "field": "like",
                "modifier": "log1p",
                "factor": 2
            }
        }
    }
}
2.2.4 boost_mode

就算加上了modifier,但是 “全文评分 与 field_value_factor函数值乘积” 的效果可能还是太大,我们可以通过参数boost_mode来决定 old_score加强score 合併的方法。

  • 如果将boost_mode改成sum,可以大幅弱化最终效果,特别是使用一个较小的factor时;
  • 加入了boost_mode=sum、且factor=0.1的公式变为new_score = old_score + log(1 + 0.1 * like值)

在这里插入图片描述

对刚刚的例子加上max_boost参数的查询语句如下:

GET 127.0.0.1/mytest/doc/_search
{
    "query": {
        "function_score": {
            "query": {
                "match": {
                    "title": "ES"
                }
            },
            "field_value_factor": {
                "field": "like",
                "modifier": "log1p",
                "factor": 0.1
            },
            "boost_mode": "sum"
        }
    }
}
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值