当前位置:首页 > 科技  > 软件

深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析

来源: 责编: 时间:2023-08-05 11:45:48 2721观看
导读在 Elasticsearch 中,function_score 可以让我们在查询的同时对搜索结果进行自定义评分。function_score 提供了一系列的参数和函数让我们可以根据需求灵活地进行设置。近期有同学反馈,function_score 的相关参数不好理

在 Elasticsearch 中,function_score 可以让我们在查询的同时对搜索结果进行自定义评分。Xcq28资讯网——每日最新资讯28at.com

function_score 提供了一系列的参数和函数让我们可以根据需求灵活地进行设置。Xcq28资讯网——每日最新资讯28at.com

近期有同学反馈,function_score 的相关参数不好理解,本文将深入探讨 function_score 的核心参数和函数。Xcq28资讯网——每日最新资讯28at.com

图片图片Xcq28资讯网——每日最新资讯28at.com

1、function_score 函数的用途及适用场景

Elasticsearch 的 function_score 查询是一种强大的工具,它可以允许我们修改文档的基本的相关评分,让我们在特定的应用场景下获得更好的搜索结果。Xcq28资讯网——每日最新资讯28at.com

这个功能通过提供了一组内置函数(如 script_score, weight, random_score, field_value_factor, decay functions等),以及一系列参数(如boost_mode和score_mode等)来实现。Xcq28资讯网——每日最新资讯28at.com

以下是一些 function_score 可以应用的场景:Xcq28资讯网——每日最新资讯28at.com

1.1 用户偏好场景

如果需要了解用户的兴趣或者行为,我们可以使用 function_score 来提升用户可能感兴趣的结果。Xcq28资讯网——每日最新资讯28at.com

比如在推荐系统中,如果我们已知道用户喜欢某个作者的文章,可以提升这个作者的文章的得分。Xcq28资讯网——每日最新资讯28at.com

比如最近火热的“罗刹海市”就被网易云音乐推荐到最前面。Xcq28资讯网——每日最新资讯28at.com

图片图片Xcq28资讯网——每日最新资讯28at.com

1.2 随机抽样场景

如果我们需要从一个大的数据集中随机抽样,可以使用 random_score 函数。Xcq28资讯网——每日最新资讯28at.com

这个函数会给每个文档生成一个随机得分,从而让我们能够得到随机的搜索结果。Xcq28资讯网——每日最新资讯28at.com

1.3 时间敏感的查询场景

对于一些时间敏感的数据,比如新闻、博客文章或者论坛帖子,新的文档通常比旧的文档更相关。Xcq28资讯网——每日最新资讯28at.com

在这种情况下,我们可以使用 decay functions(衰减函数) 来降低旧的文档的得分。Xcq28资讯网——每日最新资讯28at.com

1.4 地理位置敏感的查询场景

如果我们的应用关心地理位置,比如房地产或者旅游相关的应用。Xcq28资讯网——每日最新资讯28at.com

可以使用 decay functions (衰减函数)来提升接近某个地理位置的文档的得分。Xcq28资讯网——每日最新资讯28at.com

1.5 特定字段影响场景

如果我们的文档有一些字段值可以影响相关度评分,可以使用 field_value_factor (字段值因子)函数。Xcq28资讯网——每日最新资讯28at.com

比如在电商场景,一个商品的销量、评分或者评论数量可能会影响搜索结果的排序。Xcq28资讯网——每日最新资讯28at.com

总的来说,function_score 提供了一种灵活的方式来满足各种复杂的相关度评分需求。Xcq28资讯网——每日最新资讯28at.com

2、function_score 参数介绍

2.1 boost_mode 参数

boost_mode 决定了如何将查询得分和函数得分进行组合。Xcq28资讯网——每日最新资讯28at.com

可接受的参数有:Xcq28资讯网——每日最新资讯28at.com

boost_modeXcq28资讯网——每日最新资讯28at.com

描述Xcq28资讯网——每日最新资讯28at.com

multiplyXcq28资讯网——每日最新资讯28at.com

查询得分和函数得分相乘(默认值)Xcq28资讯网——每日最新资讯28at.com

sumXcq28资讯网——每日最新资讯28at.com

查询得分和函数得分相加Xcq28资讯网——每日最新资讯28at.com

avgXcq28资讯网——每日最新资讯28at.com

查询得分和函数得分的平均值Xcq28资讯网——每日最新资讯28at.com

firstXcq28资讯网——每日最新资讯28at.com

仅仅使用函数得分Xcq28资讯网——每日最新资讯28at.com

maxXcq28资讯网——每日最新资讯28at.com

查询得分和函数得分中的最大值Xcq28资讯网——每日最新资讯28at.com

minXcq28资讯网——每日最新资讯28at.com

查询得分和函数得分中的最小值Xcq28资讯网——每日最新资讯28at.com

replaceXcq28资讯网——每日最新资讯28at.com

完全替换查询得分,只使用函数得分Xcq28资讯网——每日最新资讯28at.com

2.2 score_mode

score_mode 决定了如何处理多个函数的分数。Xcq28资讯网——每日最新资讯28at.com

可接受的参数有:Xcq28资讯网——每日最新资讯28at.com

score_modeXcq28资讯网——每日最新资讯28at.com

描述Xcq28资讯网——每日最新资讯28at.com

multiplyXcq28资讯网——每日最新资讯28at.com

各个函数得分相乘Xcq28资讯网——每日最新资讯28at.com

sumXcq28资讯网——每日最新资讯28at.com

各个函数得分相加(默认值)Xcq28资讯网——每日最新资讯28at.com

avgXcq28资讯网——每日最新资讯28at.com

各个函数得分的平均值Xcq28资讯网——每日最新资讯28at.com

firstXcq28资讯网——每日最新资讯28at.com

仅仅使用第一个函数的得分Xcq28资讯网——每日最新资讯28at.com

maxXcq28资讯网——每日最新资讯28at.com

各个函数得分中的最大值Xcq28资讯网——每日最新资讯28at.com

minXcq28资讯网——每日最新资讯28at.com

各个函数得分中的最小值Xcq28资讯网——每日最新资讯28at.com

2.3 提供的函数

function_score 提供了多种函数类型来进行自定义评分:Xcq28资讯网——每日最新资讯28at.com

Score FunctionXcq28资讯网——每日最新资讯28at.com

描述Xcq28资讯网——每日最新资讯28at.com

script_scoreXcq28资讯网——每日最新资讯28at.com

用脚本计算得分Xcq28资讯网——每日最新资讯28at.com

weightXcq28资讯网——每日最新资讯28at.com

简单地修改查询得分,不考虑字段值Xcq28资讯网——每日最新资讯28at.com

random_scoreXcq28资讯网——每日最新资讯28at.com

生成随机得分Xcq28资讯网——每日最新资讯28at.com

field_value_factorXcq28资讯网——每日最新资讯28at.com

使用字段值进行计算得分Xcq28资讯网——每日最新资讯28at.com

decay functionsXcq28资讯网——每日最新资讯28at.com

衰减函数,根据字段值的距离计算得分,越近得分越高Xcq28资讯网——每日最新资讯28at.com

3、function_score 使用实战解读

3.1 构造数据

为了帮助大家更好地理解,我们将创建一个简单的索引,插入一些文档,并对它们执行 function_score 查询。Xcq28资讯网——每日最新资讯28at.com

假设我们有一个名为 articles 的索引,里面存储了一些博客文章的数据,包括作者(author),标题(title),内容(content),以及这篇文章的喜欢数量(likes)。Xcq28资讯网——每日最新资讯28at.com

首先,创建索引并添加一些文档:Xcq28资讯网——每日最新资讯28at.com

PUT /articles{  "mappings": {    "properties": {      "title": { "type": "text" },      "author": { "type": "text" },      "content": { "type": "text" },      "likes": { "type": "integer" }    }  }}POST /_bulk{ "index" : { "_index" : "articles", "_id" : "1" } }{ "title": "Elasticsearch Basics", "author": "John Doe", "content": "This article introduces the basics of Elasticsearch.", "likes": 100 }{ "index" : { "_index" : "articles", "_id" : "2" } }{ "title": "Advanced Elasticsearch", "author": "Jane Doe", "content": "This article covers advanced topics in Elasticsearch.", "likes": 500 }{ "index" : { "_index" : "articles", "_id" : "3" } }{ "title": "Elasticsearch Function Score Query", "author": "John Doe", "content": "This article discusses the function_score query in Elasticsearch.", "likes": 250 }

现在我们有了一些文档,让我们对它们执行 function_score 查询。Xcq28资讯网——每日最新资讯28at.com

3.2 使用 script_score 函数实现基于 'likes' 字段的对数加权排序

GET /articles/_search{  "query": {    "function_score": {      "query": {        "match_all": {}      },      "boost": "5",      "functions": [        {          "script_score": {            "script": {              "source": "Math.log(1 + doc['likes'].value)"            }          }        }      ],      "boost_mode": "multiply"    }  }}

上述查询使用了 Elasticsearch 的 function_score 查询。Xcq28资讯网——每日最新资讯28at.com

它首先对 "articles" 索引中的所有文档进行匹配(使用 match_all 查询),然后使用一个脚本函数(script_score),该脚本会计算每个文档的 "likes" 字段的自然对数值加一(Math.log(1 + doc['likes'].value)),然后把这个得分与原始查询得分相乘(由于 boost_mode 被设为了 "multiply"),最终的得分再乘以5(由于 boost 被设为了 "5")。这种查询用于根据 "likes" 字段对结果进行加权排序。Xcq28资讯网——每日最新资讯28at.com

执行结果如下:Xcq28资讯网——每日最新资讯28at.com

图片图片Xcq28资讯网——每日最新资讯28at.com

3.3 使用 random_score 生成基于 'likes' 字段的全随机结果查询

GET /articles/_search{  "query": {    "function_score": {      "query": {         "match_all": {}       },      "functions": [        {          "random_score": {            "field": "likes"          }        }      ],      "boost_mode": "replace"    }  }}

上述查询使用 Elasticsearch 的 function_score 查询,并配合使用 random_score 函数。random_score 函数根据 "likes" 字段的值生成一个随机分数。Xcq28资讯网——每日最新资讯28at.com

重要的是,由于没有提供一个固定的种子(seed),所以每次执行这个查询都会返回一个全新的随机排序结果。Xcq28资讯网——每日最新资讯28at.com

match_all 是基础查询,用来匹配所有文档。然后 random_score 函数基于 "likes" 字段值生成随机分数。Xcq28资讯网——每日最新资讯28at.com

boost_mode 设为 "replace" 表示忽略基础查询的分数,完全使用 random_score 函数的分数作为最终结果。所以,这个查询会在每次执行时都返回全新的随机排序结果。Xcq28资讯网——每日最新资讯28at.com

执行结果如下图所示:Xcq28资讯网——每日最新资讯28at.com

图片图片Xcq28资讯网——每日最新资讯28at.com

3.4 field_value_factor 函数根据某个字段的值来修改_score

这对于一些字段很有用,比如"likes":一篇有很多"likes"的文章可能比"likes"少的文章更相关。Xcq28资讯网——每日最新资讯28at.com

示例如下:Xcq28资讯网——每日最新资讯28at.com

GET /articles/_search{  "query": {    "function_score": {      "query": {        "match": {          "content": "Elasticsearch"        }      },      "functions": [        {          "field_value_factor": {            "field": "likes",            "factor": 1.2,            "modifier": "sqrt",            "missing": 1          }        }      ],      "boost_mode": "multiply"    }  }}

在这个查询中:Xcq28资讯网——每日最新资讯28at.com

  • "match": { "content": "Elasticsearch" }

表示基础查询是在 "content" 字段中匹配包含 "Elasticsearch" 的文章。Xcq28资讯网——每日最新资讯28at.com

  • field_value_factor

函数用来基于 "likes" 字段的值调整查询得分。它首先取 "likes" 字段的值,如果文档没有 "likes" 字段或者该字段的值为空,那么将使用 "missing" 参数指定的默认值1。然后,它将取得的值乘以 "factor" 参数指定的因子1.2。最后,它将结果进行 "modifier" 参数指定的平方根运算("sqrt")。Xcq28资讯网——每日最新资讯28at.com

  • boost_mode

参数设置为 "multiply",这表示将基础查询的得分和 field_value_factor 函数计算得出的得分相乘,以得到最终的文档得分。Xcq28资讯网——每日最新资讯28at.com

所以,这个查询会返回包含 "Elasticsearch" 的文章,并且文章的得分会根据 "likes" 字段的值进行调整,"likes" 值越高的文章,得分也会越高。Xcq28资讯网——每日最新资讯28at.com

执行结果如下:Xcq28资讯网——每日最新资讯28at.com

图片图片Xcq28资讯网——每日最新资讯28at.com

3.5 decay functions 根据某个字段的值的距离来调整_score。

如果值接近某个中心点,得分就会更高。这对于日期或地理位置字段特别有用。Xcq28资讯网——每日最新资讯28at.com

Elasticsearch 提供了三种衰减函数:线性(linear)、指数(exp)、和高斯(gauss)。Xcq28资讯网——每日最新资讯28at.com

以下是使用 gauss 函数的一个示例:Xcq28资讯网——每日最新资讯28at.com

GET /articles/_search{  "query": {    "function_score": {      "query": {        "match": {          "content": "Elasticsearch"        }      },      "functions": [        {          "gauss": {            "likes": {              "origin": "100",              "scale": "20",              "offset": "0",              "decay": 0.5            }          }        }      ],      "boost_mode": "multiply"    }  }}

上述执行可概括为:使用 function_score 和 gauss 函数对含有 'Elasticsearch' 的文章进行基于 'likes' 字段的高斯衰减得分调整"。Xcq28资讯网——每日最新资讯28at.com

在这个查询中:Xcq28资讯网——每日最新资讯28at.com

  • "match": { "content": "Elasticsearch" }

表示基础查询是在 "content" 字段中匹配包含 "Elasticsearch" 的文章。Xcq28资讯网——每日最新资讯28at.com

  • gauss

函数则是用来对 "likes" 字段的值进行高斯衰减处理。Xcq28资讯网——每日最新资讯28at.com

其中,Xcq28资讯网——每日最新资讯28at.com

参数Xcq28资讯网——每日最新资讯28at.com

Xcq28资讯网——每日最新资讯28at.com

描述Xcq28资讯网——每日最新资讯28at.com

originXcq28资讯网——每日最新资讯28at.com

100Xcq28资讯网——每日最新资讯28at.com

期望的中心点,即 "likes" 字段的最理想值Xcq28资讯网——每日最新资讯28at.com

scaleXcq28资讯网——每日最新资讯28at.com

20Xcq28资讯网——每日最新资讯28at.com

表示衰减的速度,也就是距离 "origin" 值多远时,得分会衰减到原始得分的一半Xcq28资讯网——每日最新资讯28at.com

offsetXcq28资讯网——每日最新资讯28at.com

0Xcq28资讯网——每日最新资讯28at.com

表示在距离 "origin" 多少的范围内不进行衰减Xcq28资讯网——每日最新资讯28at.com

decayXcq28资讯网——每日最新资讯28at.com

0.5Xcq28资讯网——每日最新资讯28at.com

表示当距离超过了 "scale" 之后,得分会以多快的速度衰减,例如 0.5 表示超过 "scale" 距离后,得分会衰减到原始得分的一半Xcq28资讯网——每日最新资讯28at.com

  • boost_mode

参数设置为 "multiply",这表示将基础查询的得分和 gauss 函数计算得出的得分相乘,以得到最终的文档得分。Xcq28资讯网——每日最新资讯28at.com

所以,这个查询会返回包含 "Elasticsearch" 的文章,并且文章的得分会根据 "likes" 字段的值进行高斯衰减处理,"likes" 值越接近100的文章,得分也会越高。Xcq28资讯网——每日最新资讯28at.com

图片图片Xcq28资讯网——每日最新资讯28at.com

4、小结

在深入了解 Elasticsearch 的 function_score 后,我们可以明显感受到其在搜索应用中的强大作用。无论是基于特定字段值的排序,还是利用自定义脚本微调搜索结果,function_score 都能发挥其出色的性能。Xcq28资讯网——每日最新资讯28at.com

尽管 function_score 的参数和选项多样,初看可能会觉得复杂,但只需理解各参数的含义和作用,我们就能根据需求灵活运用。实际案例中,我们使用了 script_score、field_value_factor、random_score 和 decay functions 等函数,演示了如何通过 function_score 满足复杂的搜索需求。Xcq28资讯网——每日最新资讯28at.com

但是,我们也必须注意,在使用 function_score 时,要慎重考虑性能问题,因为复杂的函数和脚本可能占用大量计算资源。在实际应用中,我们应始终关注这一点,以维护良好的系统性能。Xcq28资讯网——每日最新资讯28at.com

此外,随着数据和用户行为的不断变化,我们需要持续观察、学习和调整搜索策略,以不断提升用户体验。在这个过程中,function_score 将是我们强有力的工具。Xcq28资讯网——每日最新资讯28at.com

总的来说,Elasticsearch 的 function_score 是一个强大而灵活的工具,只要我们深入了解并恰当使用,就能够挖掘其巨大的潜力,提升我们的搜索应用性能和用户体验。Xcq28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-132-0.html深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 在线图片编辑器,支持PSD解析、AI抠图等

下一篇: 三万字盘点 Spring 九大核心基础功能

标签:
  • 热门焦点
Top