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

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

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

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


1. 概念

  • query 上下文 :算 _score(相关性打分),回答「有多匹配」。
  • filter 上下文 :只判断 yes/no,不算分,可缓存、更快,回答「符不符合」。
  • 调分手段:字段 boostboosting 查询(降权而非排除)、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/boostingboosting 能降权而不是直接排除。
  3. function_score 谨慎 :脚本/函数打分贵,boost_mode/score_mode 要选对。
  4. 别对海量结果排相关性 :能用业务字段排序(日期、金额)就别都靠 _score
  5. 调分先 explain:打分不符预期时用 explain 看每项贡献,别盲改。

相关推荐
崔高杰2 小时前
【自动阅读笔记】Inference-Time Scaling for Generalist Reward Modeling
人工智能·笔记·机器学习
AI科技星3 小时前
全域光速运动理论体系 (GAQ-UFT)——范式重构、核心方程与传统物理的本质分野
人工智能·线性代数·机器学习·重构·数据挖掘·回归·ai科技星
circuitsosk4 小时前
大规模离线数据管道构建:样本获取、清洗、加工与合成
人工智能·python·机器学习·搜索引擎
海兰4 小时前
【思考】银行落地业务Agent的思考
人工智能·机器学习·agent
满怀冰雪5 小时前
15-Paddle 高层 API 入门:paddle.Model 的训练与评估流程
人工智能·python·深度学习·机器学习·paddle
YFJ_mily8 小时前
【会议征稿】第八届人本计算与数据智能国际会议(HCC 2026)| 广州12月召开,EI/Scopus稳定检索,多届收录无忧
机器学习·人机交互·ei会议·数据智能·rdlink研发家·人本计算·广州会议
陕西企来客13 小时前
2026年7月AI智能搜索曝光趋势研判
大数据·人工智能·机器学习·ai智能搜索曝光
Hrain-AI16 小时前
2026 企业 AI 智能体平台横评:8 大主流平台 7 维度实测对比
人工智能·算法·机器学习