当前位置:首页 >百科 >深度探索 Elasticsearch 8.X:function 可以使用 random_score 函数

深度探索 Elasticsearch 8.X:function 可以使用 random_score 函数

2024-07-01 11:22:38 [百科] 来源:避面尹邢网

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

作者:铭毅天下 开发 开发工具 在深入了解 Elasticsearch 的深度 function_score 后,我们可以明显感受到其在搜索应用中的探索强大作用。无论是深度基于特定字段值的排序,还是探索利用自定义脚本微调搜索结果,function_score 都能发挥其出色的深度性能。

在 Elasticsearch 中,探索function_score 可以让我们在查询的深度同时对搜索结果进行自定义评分。

function_score 提供了一系列的探索参数和函数让我们可以根据需求灵活地进行设置。

深度探索 Elasticsearch 8.X:function 可以使用 random_score 函数

近期有同学反馈,深度function_score 的探索相关参数不好理解,本文将深入探讨 function_score 的深度核心参数和函数。

深度探索 Elasticsearch 8.X:function 可以使用 random_score 函数

图片图片

深度探索 Elasticsearch 8.X:function 可以使用 random_score 函数

1、探索function_score 函数的深度用途及适用场景

Elasticsearch 的 function_score 查询是一种强大的工具,它可以允许我们修改文档的探索基本的相关评分,让我们在特定的深度应用场景下获得更好的搜索结果。

这个功能通过提供了一组内置函数(如 script_score, weight, random_score, field_value_factor, decay functions等),以及一系列参数(如boost_mode和score_mode等)来实现。

以下是一些 function_score 可以应用的场景:

1.1 用户偏好场景

如果需要了解用户的兴趣或者行为,我们可以使用 function_score 来提升用户可能感兴趣的结果。

比如在推荐系统中,如果我们已知道用户喜欢某个作者的文章,可以提升这个作者的文章的得分。

比如最近火热的“罗刹海市”就被网易云音乐推荐到最前面。

图片图片

1.2 随机抽样场景

如果我们需要从一个大的数据集中随机抽样,可以使用 random_score 函数。

这个函数会给每个文档生成一个随机得分,从而让我们能够得到随机的搜索结果。

1.3 时间敏感的查询场景

对于一些时间敏感的数据,比如新闻、博客文章或者论坛帖子,新的文档通常比旧的文档更相关。

在这种情况下,我们可以使用 decay functions(衰减函数) 来降低旧的文档的得分。

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

如果我们的应用关心地理位置,比如房地产或者旅游相关的应用。

可以使用 decay functions (衰减函数)来提升接近某个地理位置的文档的得分。

1.5 特定字段影响场景

如果我们的文档有一些字段值可以影响相关度评分,可以使用 field_value_factor (字段值因子)函数。

比如在电商场景,一个商品的销量、评分或者评论数量可能会影响搜索结果的排序。

总的来说,function_score 提供了一种灵活的方式来满足各种复杂的相关度评分需求。

2、function_score 参数介绍

2.1 boost_mode 参数

boost_mode 决定了如何将查询得分和函数得分进行组合。

可接受的参数有:

boost_mode

描述

multiply

查询得分和函数得分相乘(默认值)

sum

查询得分和函数得分相加

avg

查询得分和函数得分的平均值

first

仅仅使用函数得分

max

查询得分和函数得分中的最大值

min

查询得分和函数得分中的最小值

replace

完全替换查询得分,只使用函数得分

2.2 score_mode

score_mode 决定了如何处理多个函数的分数。

可接受的参数有:

score_mode

描述

multiply

各个函数得分相乘

sum

各个函数得分相加(默认值)

avg

各个函数得分的平均值

first

仅仅使用第一个函数的得分

max

各个函数得分中的最大值

min

各个函数得分中的最小值

2.3 提供的函数

function_score 提供了多种函数类型来进行自定义评分:

Score Function

描述

script_score

用脚本计算得分

weight

简单地修改查询得分,不考虑字段值

random_score

生成随机得分

field_value_factor

使用字段值进行计算得分

decay functions

衰减函数,根据字段值的距离计算得分,越近得分越高

3、function_score 使用实战解读

3.1 构造数据

为了帮助大家更好地理解,我们将创建一个简单的索引,插入一些文档,并对它们执行 function_score 查询。

假设我们有一个名为 articles 的索引,里面存储了一些博客文章的数据,包括作者(author),标题(title),内容(content),以及这篇文章的喜欢数量(likes)。

首先,创建索引并添加一些文档:

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 查询。

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 查询。

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

执行结果如下:

图片图片

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" 字段的值生成一个随机分数。

重要的是,由于没有提供一个固定的种子(seed),所以每次执行这个查询都会返回一个全新的随机排序结果。

match_all 是基础查询,用来匹配所有文档。然后 random_score 函数基于 "likes" 字段值生成随机分数。

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

执行结果如下图所示:

图片图片

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

这对于一些字段很有用,比如"likes":一篇有很多"likes"的文章可能比"likes"少的文章更相关。

示例如下:

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"    }  }}

在这个查询中:

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

表示基础查询是在 "content" 字段中匹配包含 "Elasticsearch" 的文章。

  • field_value_factor

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

  • boost_mode

参数设置为 "multiply",这表示将基础查询的得分和 field_value_factor 函数计算得出的得分相乘,以得到最终的文档得分。

所以,这个查询会返回包含 "Elasticsearch" 的文章,并且文章的得分会根据 "likes" 字段的值进行调整,"likes" 值越高的文章,得分也会越高。

执行结果如下:

图片图片

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

如果值接近某个中心点,得分就会更高。这对于日期或地理位置字段特别有用。

Elasticsearch 提供了三种衰减函数:线性(linear)、指数(exp)、和高斯(gauss)。

以下是使用 gauss 函数的一个示例:

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' 字段的高斯衰减得分调整"。

在这个查询中:

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

表示基础查询是在 "content" 字段中匹配包含 "Elasticsearch" 的文章。

  • gauss

函数则是用来对 "likes" 字段的值进行高斯衰减处理。

其中,

参数

描述

origin

100

期望的中心点,即 "likes" 字段的最理想值

scale

20

表示衰减的速度,也就是距离 "origin" 值多远时,得分会衰减到原始得分的一半

offset

0

表示在距离 "origin" 多少的范围内不进行衰减

decay

0.5

表示当距离超过了 "scale" 之后,得分会以多快的速度衰减,例如 0.5 表示超过 "scale" 距离后,得分会衰减到原始得分的一半

  • boost_mode

参数设置为 "multiply",这表示将基础查询的得分和 gauss 函数计算得出的得分相乘,以得到最终的文档得分。

所以,这个查询会返回包含 "Elasticsearch" 的文章,并且文章的得分会根据 "likes" 字段的值进行高斯衰减处理,"likes" 值越接近100的文章,得分也会越高。

图片图片

4、小结

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

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

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

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

总的来说,Elasticsearch 的 function_score 是一个强大而灵活的工具,只要我们深入了解并恰当使用,就能够挖掘其巨大的潜力,提升我们的搜索应用性能和用户体验。

责任编辑:武晓燕 来源: 铭毅天下Elasticsearch 工具搜索排序

(责任编辑:时尚)

    推荐文章
    热点阅读