第五阶段 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 看每项贡献,别盲改。

相关推荐
Q264336502312 分钟前
【有源码】基于文本挖掘的消费者金融投诉主题发现与风险预警研究,基于Python的CFPB消费者投诉数据可视化分析系统
大数据·hadoop·机器学习·数据挖掘·spark·毕业设计·课程设计
棣廷1 小时前
初识OpenCV——Dlib人脸检测、关键点定位与表情识别
opencv·目标检测·机器学习
来让爷抱一个3 小时前
2026 视觉语言模型实战:八帧跳跃不许看走样,百智云精灵图把图文契约写进素材包
人工智能·机器学习
渡我白衣3 小时前
Util工具类功能设计与类设计
linux·服务器·网络·c++·人工智能·目标检测·机器学习
workflower3 小时前
AI 转型正从工具部署转向生产关系重构
人工智能·安全·机器学习·机器人·无人机
Q26433650234 小时前
【有源码】基于机器学习的商场商铺运营分群与可视化分析研究 基于Spark的商场商铺经营效率分析与可视化
大数据·hadoop·机器学习·数据挖掘·数据分析·spark·毕业设计
Allen_LVyingbo6 小时前
医疗人工智能项目全生命周期管理系统:监管知识建模、工程实现与实证评估(上)
网络·人工智能·机器学习·语言模型·自动化
罗西的思考15 小时前
机器人模型(WM / WAM / VLA)综合分析与对比:从「看」到「想」再到「做」
人工智能·算法·机器学习
猎头南楼17 小时前
大模型后训练与 Agent 自迭代:两类工程能力的观察
人工智能·深度学习·机器学习
Zzj_tju20 小时前
VLM 读图评测:先审计评分器,再判断读错还是算错
人工智能·深度学习·机器学习·语言模型