ElasticSearch 8.12如何按字段值高低设置查询评分?
Elasticsearch 8.12 自定义评分:按字段值高低分配_score
要实现你需要的字段值越高、_score评分越高的效果,同时过滤掉不符合条件的文档,得用function_score查询——这是Elasticsearch里自定义文档评分的核心方案,之前用range+boost的方式只能给匹配的文档统一加权重,没法根据字段数值动态调整评分。
具体查询实现
下面的查询会先过滤出rating>=4且prev_rating>=4.1的文档,再根据这两个字段的数值高低计算最终_score:
{ "query": { "function_score": { // 第一步:过滤符合条件的文档 "query": { "bool": { "must": [ { "range": { "prev_rating": { "gte": 4.1 } } }, { "range": { "rating": { "gte": 4 } } } ] } }, // 第二步:自定义评分规则 "functions": [ // 根据rating字段计算得分,factor是权重系数 { "field_value_factor": { "field": "rating", "factor": 4, "modifier": "none" } }, // 根据prev_rating字段计算得分,可按需调整权重 { "field_value_factor": { "field": "prev_rating", "factor": 2, "modifier": "none" } } ], // 多个评分函数的组合方式:sum表示把两个函数的得分相加 "boost_mode": "sum", // 只保留过滤后的文档,不符合条件的直接排除 "min_score": 1 } } }
关键参数解释
field_value_factor:直接基于字段数值计算得分,公式是字段值 × factor,modifier可以加额外处理(比如log让高分增长放缓,sqrt弱化数值差异,这里用none就是直接相乘)boost_mode:控制多个评分函数的结果如何合并,可选sum(相加)、multiply(相乘)、max(取最大值)等min_score:设置最低得分阈值,不符合过滤条件的文档得分会是0,会被自动排除
调整得分范围
如果想要_score更接近你示例里的20、13、10,可以调整factor的数值:
- 比如把rating的factor改成5,prev_rating的factor改成0,只基于rating计算:
这样id5的_score就是"functions": [ { "field_value_factor": { "field": "rating", "factor": 5, "modifier": "none" } } ]4.834×5≈24,id4是4.434×5≈22,id3是4.134×5≈20,再微调factor就能得到你想要的分数区间。
内容的提问来源于stack exchange,提问作者Kojimba
相关产品推荐
相关产品推荐

