音乐网站建设的意义,硬件开发外包,郑州代理记账网站建设,网站转移服务器需要重新备案吗在 Elasticsearch 中#xff0c;function_score 可以让我们在查询的同时对搜索结果进行自定义评分。 function_score 提供了一系列的参数和函数让我们可以根据需求灵活地进行设置。 近期有同学反馈#xff0c;function_score 的相关参数不好理解#xff0c;本文将深入探讨 f… 在 Elasticsearch 中function_score 可以让我们在查询的同时对搜索结果进行自定义评分。 function_score 提供了一系列的参数和函数让我们可以根据需求灵活地进行设置。 近期有同学反馈function_score 的相关参数不好理解本文将深入探讨 function_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 字段的值进行高斯衰减处理。 其中 参数值描述origin100期望的中心点即 likes 字段的最理想值scale20表示衰减的速度也就是距离 origin 值多远时得分会衰减到原始得分的一半offset0表示在距离 origin 多少的范围内不进行衰减decay0.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 是一个强大而灵活的工具只要我们深入了解并恰当使用就能够挖掘其巨大的潜力提升我们的搜索应用性能和用户体验。 推荐阅读 全网首发从 0 到 1 Elasticsearch 8.X 通关视频重磅 | 死磕 Elasticsearch 8.X 方法论认知清单如何系统的学习 Elasticsearch 2023做点事实战 | Elasticsearch自定义评分的N种方法干货 | 一步步拆解 Elasticsearch BM25 模型评分细节Elasticsearch 如何把评分限定在0到1之间 更短时间更快习得更多干货 和全球 近2000 Elastic 爱好者一起精进 大模型时代抢先一步学习进阶干货