乐闻世界logo
搜索文章和话题

Elasticsearch - How to normalize score when combining regular query and function_score?

3 个月前提问
3 个月前修改
浏览次数5

1个答案

1

在Elasticsearch中结合常规查询和function_score查询时,我们可能会遇到一个问题:常规查询和功能得分的相对重要性如何平衡?为了解决这个问题,我们可以使用规范化分数的方法来确保得分是合理分配的。

步骤1: 使用常规查询进行搜索

首先,我们需要定义一个常规的查询,用来搜索满足基本条件的文档。例如,假设我们需要在一个商品数据库中搜索包含特定关键字的商品。

json
{ "query": { "match": { "description": "smartphone" } } }

步骤2: 应用 function_score

其次,我们使用function_score来调整这些搜索结果的得分。这可以通过多种方式实现,例如根据某些字段的值(如用户评分、销量等)增加得分。

json
{ "query": { "function_score": { "query": { "match": { "description": "smartphone" } }, "functions": [ { "field_value_factor": { "field": "sales", "factor": 1.2, "modifier": "sqrt", "missing": 1 } } ], "score_mode": "multiply" } } }

在这个例子中,我们对每个文档的基本得分应用了一个基于销量的加权因子,使用了一个平方根调制器来减少高销量对得分的极端影响。

步骤3: 规范化分数

最重要的一步是分数的规范化。因为不同的函数可能导致得分范围差异很大,我们需要使用一种方法来规范化这些得分。Elasticsearch提供了多种方式,例如min, max, avg等,但通常需要自定义脚本来精确控制得分的规范化。

json
{ "query": { "function_score": { "query": { "match": { "description": "smartphone" } }, "functions": [ { "field_value_factor": { "field": "sales", "factor": 1.2, "modifier": "sqrt", "missing": 1 } } ], "score_mode": "multiply", "boost_mode": "replace", "script_score": { "script": { "source": "Math.log(1 + _score * params.factor)", "params": { "factor": 10 } } } } } }

在这里,我们使用了一个自定义脚本来调整最终得分。这个脚本取得原始得分(由function_score计算得出),并应用一个对数函数来减少高得分的影响,同时通过参数factor调整得分的灵敏度。

结论

通过这种方式,我们可以组合使用基本查询和function_score,同时通过应用规范化和自定义脚本来保证得分的合理性和适用性。这样的查询不但可以根据基本的匹配条件筛选文档,还可以根据业务需求调整文档的得分,实现更精细化的搜索结果排序。

2024年8月14日 21:54 回复

你的答案