Elasticsearch function_score函数之field_value_factor(字段值影响_score)

本文介绍如何使用Elasticsearch的field_value_factor功能来自定义文档评分机制,特别是通过文档字段值影响评分的方式,同时提供了注意事项及异常处理建议。
使用Elasticsearch的同志来说,简单的搜索语句,已经达不到我们业务的需求,
想要的内容,已经不在限于全部的内容, Elasticsearch是一个实时的分布式搜索和分析引擎。
它可以帮助我们处理大规模数据,
用于全文搜索,结构化搜索以及分析,
很多时候我们是需要将这三者进行组合。
我们会去自定义它的打分机制:Function_score,

要使用function_score,用户必须定义​​一个查询和一个或多个函数,为查询返回的每个文档计算新的分数。

==============闲话不多说了,

今天就要说一下里面的field_value_factor,

field_value_factor功能允许您使用文档中的字段来影响score,

我写的一个例子供参考:

  {           "field_value_factor": {             "field": "view",             "modifier": "ln1p",             "missing": 1           }      }

具体的使用我们可以去查各种文档,我要说的是我们使用的时候要注意些什么

  1. 如果在多值字段上使用,则只有字段的第一个值用于计算。
  2. 使用的时候可能会遇到missing这个异常 Missing value for field [***] ,如果这个字段不exists,可能会报这个异常
查看官网看到:
missing

Value used if the document doesn’t have that field. The modifier and factor are still applied to it as though it were read from the document.

Keep in mind that taking the log() of 0, or the square root of a negative number
is an illegal operation, and an exception will be thrown. Be sure to limit the
values of the field with a range filter to avoid this, or use `log1p` and
`ln1p`.
所以我们在使用的时候要注意了,
如果你使用的字段是一个可丢失字段,
最好使用`log1p` and`ln1p,并且要添加 missing:*, *这个值就是在丢失字段事,默认被使用的值。


<think>好的,我现在需要详细解释Elasticsearchfunction_score查询。首先,我得回顾一下自己对这个功能的理解。function_score查询主要用于自定义评分,允许用户修改查询返回文档的相关性评分,或者根据特定条件过滤文档后重新计算评分。这对于个性化搜索排名非常有用,比如根据销量、热度、时间等因素调整搜索结果排序。 接下来,我应该分步骤来组织解释。首先,介绍function_score的基本概念和作用。然后,讲解它的组成部分,比如查询、函数、评分模式、权重等。需要详细说明每个可用的函数类型,如weight、field_value_factor、random_score、衰减函数(gauss、linear、exp)以及script_score。每个函数的作用和参数都要举例说明,比如field_value_factor使用哪个字段,如何影响评分。 然后,需要讨论function_score的参数,比如boost、boost_mode、score_mode、max_boost等。这些参数控制如何将多个函数的评分合并,以及最终评分的计算方式。例如,score_mode决定各个函数评分如何组合(相加、相乘、平均等),boost_mode决定函数评分如何与原始评分结合。 接下来,应该给出一些实际应用的例子,比如电商中的商品排序,新闻文章按时间衰减等。这些例子能帮助用户理解如何组合不同的函数和参数来实现具体的业务需求。例如,结合field_value_factor提升销量高的商品,使用gauss函数让新发布的内容排名靠前。 同时,需要注意可能遇到的常见问题,比如评分归一化的问题,避免不同函数导致的评分范围差异过大。此外,还要提到性能方面的考虑,使用脚本评分可能会影响查询速度,需要合理使用缓存和优化脚本。 需要检查是否有遗漏的重要点,比如过滤器与评分的结合,如何在不影响评分的情况下过滤文档。可能还需要解释衰减函数的参数配置,比如origin、scale、offset、decay等,以及它们对评分曲线的影响。 最后,总结function_score的使用场景和最佳实践,帮助用户合理选择函数和参数配置,以达到理想的搜索排序效果。确保语言通俗易懂,结构清晰,步骤分明,方便用户理解并应用到实际项目中。</think>Elasticsearch的`function_score`查询是用于干预搜索结果相关性评分的核心功能。以下为详细解析(全文遵循LaTeX格式规范): --- ### 一、基础概念 `function_score`允许对原始查询的评分进行二次加工,通过$$评分函数$$动态调整文档排名。适用于: 1. 提升热门商品权重($field\_value\_factor$) 2. 时间衰减效果($gauss/exp/linear$) 3. 随机排序($random\_score$) 4. 自定义脚本评分($script\_score$) --- ### 二、核心结构 ```json { "query": { "function_score": { "query": {}, // 原始查询 "functions": [], // 函数列表 "score_mode": "", // 函数间评分组合方式 "boost_mode": "", // 最终评分组合方式 "max_boost": 100 // 评分上限 } } } ``` --- ### 三、评分函数详解 #### 1. weight函数(固定加权) ```json { "weight": 2, "filter": { "term": { "category": "电子产品" } } } ``` - 效果:匹配过滤器的文档评分$ \times 2$ #### 2. field_value_factor字段加权) ```json { "field_value_factor": { "field": "sales", "factor": 1.2, "modifier": "sqrt", "missing": 1 } } ``` - 计算公式:$$ new\_score = old\_score \times \sqrt{(factor \times sales)} $$ #### 3. 衰减函数(距离衰减) ```json { "gauss": { "publish_date": { "origin": "now", "scale": "10d", "offset": "3d", "decay": 0.5 } } } ``` - 衰减曲线:距离`origin`越远评分越低 - 参数关系:$$ offset + scale \rightarrow 衰减到decay $$ #### 4. random_score(随机排序) ```json { "random_score": { "seed": 10, "field": "_seq_no" } } ``` - 相同seed生成确定性随机数 #### 5. script_score(自定义脚本) ```json { "script_score": { "script": { "source": """ double price = doc['price'].value; return _score * Math.log(price); """ } } ``` - 支持Painless脚本动态计算评分 --- ### 四、组合控制参数 | 参数 | 作用 | 可选 | |-------------|--------------------------------------------------------------------|---------------------------------| | score_mode | 多个函数的评分组合方式 | sum, avg, max, min, multiply | | boost_mode | 最终评分与原始评分的组合方式 | replace, multiply, sum, avg... | | max_boost | 函数评分上限(避免评分爆炸) | 默认FLT_MAX | --- ### 五、实战案例 电商商品搜索排序需求: - 基础匹配:商品名称包含"手机" - 提升权重:品牌为"Apple"的权重$\times 3$ - 销量因子:$$ score = score \times \log(1 + sales) $$ - 时间衰减:3天内发布的商品优先 对应DSL: ```json { "query": { "function_score": { "query": { "match": { "name": "手机" } }, "functions": [ { "filter": { "term": { "brand": "Apple" } }, "weight": 3 }, { "field_value_factor": { "field": "sales", "modifier": "ln1p" } }, { "gauss": { "publish_date": { "origin": "now", "scale": "3d", "offset": "1d" } } } ], "score_mode": "sum", "boost_mode": "multiply" } } } ``` --- ### 六、注意事项 1. 性能影响:脚本评分和复杂函数会增加CPU开销 2. 评分归一化:建议通过`normalization`控制评分范围 3. 结果验证:使用`explain=true`查看评分计算细节 通过合理组合函数,可实现符合业务需求的精细化排序效果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值