当前位置:  首页>> 技术小册>> ElasticSearch入门与实践

ElasticSearch高级特性:函数评分

在ElasticSearch的广阔世界中,搜索不仅仅是简单地匹配关键词与文档内容。为了提升搜索结果的相关性和用户体验,ElasticSearch提供了强大的评分机制,允许开发者根据复杂的逻辑对搜索结果进行排序和打分。其中,函数评分(Function Score Query)是这一机制中的高级特性之一,它允许用户自定义评分的计算方式,结合多种因素如文本相关性、字段值、用户行为数据等,来精细控制搜索结果的排序顺序。

一、函数评分简介

函数评分(Function Score Query)是ElasticSearch中一种强大的查询类型,它允许你在查询结果的基础上,应用一个或多个函数来调整每个文档的评分。这些函数可以基于文档的字段值、距离、脚本计算结果等多种因素来计算额外的分数,最终将这个分数与文档的基础评分(基于TF-IDF等算法计算得出)结合,形成最终的排序依据。

函数评分查询的基本结构如下:

  1. {
  2. "query": {
  3. "function_score": {
  4. "query": { ... }, // 基础查询
  5. "functions": [ // 评分函数列表
  6. {
  7. "field_value_factor": { ... },
  8. "weight": 10
  9. },
  10. {
  11. "gauss": { ... },
  12. "weight": 5
  13. },
  14. ...
  15. ],
  16. "boost_mode": "multiply", // 分数计算模式
  17. "score_mode": "avg", // 最终分数的计算方式
  18. "max_boost": 3.0, // 最大增强因子
  19. "min_score": 0.1 // 过滤掉低于此分数的文档
  20. }
  21. }
  22. }

二、评分函数类型

函数评分支持多种类型的评分函数,每种函数都有其特定的应用场景和参数配置。以下是几种常见的评分函数类型:

  1. field_value_factor

    • 作用:根据字段值调整评分。可以基于字段的原始值、通过因子缩放、或者应用数学表达式(如对数、平方根等)来计算。
    • 参数field(指定字段名)、factor(缩放因子)、modifier(数学表达式类型,如loglog1plog2psquaresqrtreciprocal等)、missing(缺失值处理)等。
  2. gauss(高斯函数)

    • 作用:根据字段值与给定中心点的距离来评分,距离越近评分越高,评分呈高斯分布。
    • 参数field(字段名)、origin(中心点值)、scale(控制分布宽度的因子)、offset(偏移量,影响曲线形状)、decay(衰减方式,默认为0.5)等。
  3. linear(线性函数)

    • 作用:与高斯函数类似,但评分随距离变化呈线性关系。
    • 参数:与高斯函数相似,但无需scale参数,直接使用scalenegative_slope来控制衰减斜率。
  4. exp(指数函数)

    • 作用:基于字段值与给定点的距离,使用指数衰减模型来计算评分。
    • 参数:与高斯函数相似,但衰减方式更加陡峭。
  5. script_score

    • 作用:通过自定义脚本计算评分。
    • 参数script(脚本内容,可使用Painless等脚本语言),以及可能的脚本参数。

三、分数计算模式与最终分数计算方式

  • boost_mode:定义了如何将函数计算的分数与基础查询分数结合。常见选项有multiply(相乘)、sum(相加)、replace(替换)、avg(平均值)、first(取第一个非零分数)、max(取最大值)、min(取最小值)等。

  • score_mode:决定了如何合并多个评分函数计算出的分数。同样支持multiplysumavgfirstmaxmin等选项。

四、应用实例

假设我们有一个电商网站,需要根据商品的价格、评分、库存量以及用户历史购买行为来优化搜索结果排序。以下是一个可能的函数评分查询示例:

  1. {
  2. "query": {
  3. "function_score": {
  4. "query": {
  5. "match": {
  6. "title": "智能手表"
  7. }
  8. },
  9. "functions": [
  10. {
  11. "field_value_factor": {
  12. "field": "rating",
  13. "modifier": "linear",
  14. "factor": 1.5
  15. },
  16. "weight": 2
  17. },
  18. {
  19. "gauss": {
  20. "field": "price",
  21. "origin": 500,
  22. "scale": "200",
  23. "offset": "0",
  24. "decay": 0.5
  25. },
  26. "weight": 1
  27. },
  28. {
  29. "script_score": {
  30. "script": {
  31. "source": "if (doc['stock'].value > 10) return 1.2; else return 1.0;",
  32. "lang": "painless"
  33. }
  34. }
  35. }
  36. ],
  37. "boost_mode": "multiply",
  38. "score_mode": "sum"
  39. }
  40. }
  41. }

在这个例子中,我们使用了三种评分函数:

  • field_value_factor 根据商品评分(rating)线性调整评分,评分越高,权重越大。
  • gauss 根据商品价格(price)与中心价格(500)的距离进行高斯衰减评分,价格越接近中心值,评分越高。
  • script_score 通过Painless脚本检查库存量(stock),如果库存大于10,则额外增加评分。

通过组合这些评分函数,并设置合适的boost_modescore_mode,我们可以实现对搜索结果的多维度、精细化排序,从而提升用户体验和销售转化率。

五、总结

函数评分是ElasticSearch中一个极其强大的特性,它允许开发者根据业务需求自定义搜索结果的排序逻辑,实现更加智能、个性化的搜索体验。通过合理组合不同类型的评分函数,并调整其参数,可以灵活地应对各种复杂的搜索排序场景。无论是电商网站的商品排序、新闻网站的文章推荐,还是其他任何需要精细化搜索排序的场景,函数评分都能提供有力的支持。


该分类下的相关小册推荐: