第五阶段 41 · 相关性调优(boosting、function_score、filter vs query 上下文)

41 · 相关性调优(boosting、function_score、filter vs query 上下文)

阶段:第五阶段 / 进阶与实战

主题:_score 怎么来的、怎么调,以及 filter/query 上下文的性能差异


1. 概念

  • query 上下文 :算 _score(相关性打分),回答「有多匹配」。
  • filter 上下文 :只判断 yes/no,不算分,可缓存、更快,回答「符不符合」。
  • 调分手段:字段 boost、boosting 查询(降权而非排除)、function_score(按业务规则改分)。

PostgreSQL 没有相关性评分概念,这是 ES 相对 SQL 的核心增量能力。


2. PostgreSQL 对照

sql 复制代码
-- SQL 没有 _score,只能靠 ORDER BY 表达优先级
SELECT *,
  CASE WHEN geo_cd = 'AP' THEN 2 ELSE 1 END AS weight
FROM salesdata
WHERE material ILIKE '%thinkpad%'
ORDER BY weight DESC;

3. ES DSL

filter 上下文(不算分、可缓存)

复制代码
GET salesdata_idx/_search
{
  "query": {
    "bool": {
      "must":   [ { "match": { "material": "notebook" } } ],   // 算分
      "filter": [ { "term":  { "geo_cd": "AP" } } ]            // 不算分、缓存
    }
  }
}

字段 boost

复制代码
{ "match": { "material": { "query": "notebook", "boost": 3 } } }

function_score(按业务改分)

复制代码
GET salesdata_idx/_search
{
  "query": {
    "function_score": {
      "query": { "match": { "material": "notebook" } },
      "functions": [
        { "filter": { "term": { "geo_cd": "AP" } }, "weight": 2 },
        { "field_value_factor": { "field": "net_amount", "modifier": "log1p" } }
      ],
      "score_mode": "sum",
      "boost_mode": "multiply"
    }
  }
}

4. Spring Boot 实现

java 复制代码
@Component
public class Doc41Relevance {

    @Autowired
    private ElasticsearchClient elasticsearchClient;

    /** must 算分 + filter 精确过滤(不算分、可缓存) */
    public List<Map<String, Object>> searchScored(String indexName, String kw, String geo)
            throws IOException {
        SearchResponse<Map> resp = elasticsearchClient.search(s -> s
                .index(indexName)
                .query(q -> q.bool(b -> b
                        .must(m -> m.match(mt -> mt.field("material").query(kw).boost(3f)))
                        .filter(f -> f.term(t -> t.field("geo_cd").value(geo))))),
                Map.class);

        return resp.hits().hits().stream()
                .map(Hit::source)
                .filter(Objects::nonNull)
                .collect(Collectors.toList());
    }
}

想看每条为什么这么打分,可用 explain(.explain(true))或 _explain API 调试。


5. 坑与最佳实践

  1. 精确条件放 filter :等值/范围/枚举放 filter,省去打分开销并利用缓存。
  2. 只想排序不想过滤用 should/boosting :boosting 能降权而不是直接排除。
  3. function_score 谨慎 :脚本/函数打分贵,boost_mode/score_mode 要选对。
  4. 别对海量结果排相关性 :能用业务字段排序(日期、金额)就别都靠 _score。
  5. 调分先 explain:打分不符预期时用 explain 看每项贡献,别盲改。

相关推荐
量子-Alex6 分钟前
【大模型后训练SFT】Finetuning with Sampling: SFT Learns Better Than You Think
人工智能·深度学习·机器学习
天国梦1 小时前
哪个英语教学软件功能比较全面?我按五个维度拆了一遍
人工智能·机器学习
成为深度学习高手4 小时前
TimeBridge:用Integrated Attention与Cointegrated Attention分别桥接短期平稳与长期协整的时序预测模型
人工智能·机器学习·数据挖掘
fl1768314 小时前
工业镀金钨铜合金散热器表面缺陷识别污渍划痕分割数据集labelme格式1000张2类别低分辨率
人工智能·机器学习
成为深度学习高手5 小时前
SEMixer:以随机注意力增强patch语义、渐进混合多尺度的轻量长期时序预测模型
人工智能·深度学习·机器学习·数据挖掘·时间序列
阡陌数智6 小时前
大模型领域自适应微调:小样本场景下过拟合抑制与数据构建方法论
人工智能·深度学习·机器学习
Omics Pro6 小时前
之江实验室NAR|虚拟细胞3阶段训练范式
数据库·人工智能·算法·机器学习·自然语言处理
shaibdoio7 小时前
意图识别实战:从规则匹配到传统机器学习,再到混合大模型方案
人工智能·机器学习
言乐68 小时前
逻辑回归与利弊
人工智能·算法·机器学习·数据挖掘·逻辑回归
袖清暮雨8 小时前
机器学习之线性回归
人工智能·机器学习·线性回归