You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Elasticsearch中对余弦相似度匹配后含查询词的文档加权?

解决方法

要实现保留无查询词文档(按向量相似度得分)同时提升含查询词文档得分的需求,核心是把原来的must约束改成可选匹配,再通过多得分机制叠加权重。下面是两种可行的实现方式:

方案一:用function_score拆分得分逻辑

这种方式最直观,把向量相似度得分和文本匹配加分拆成两个独立的计算模块,最后求和得到总分:

{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}  // 匹配所有文档,确保无查询词的文档也能被返回
      },
      "functions": [
        // 模块1:计算向量余弦相似度得分(加1把[-1,1]转成[0,2],避免负分)
        {
          "script_score": {
            "script": {
              "source": "cosineSimilarity(params.query_vector, 'question_vector') + 1.0",
              "params": {"query_vector": query_vector}
            }
          }
        },
        // 模块2:给匹配查询词的文档额外加分
        {
          "filter": {
            "more_like_this": {
              "fields": ["question_text"],
              "like": query_text,
              "min_term_freq": 1,
              "max_query_terms": 12,
              "minimum_should_match": "3<60%"
            }
          },
          "weight": 2.0  // 可根据需求调整加分幅度,比如设为3.0提升更明显
        }
      ],
      "score_mode": "sum"  // 把向量得分和文本匹配加分相加
    }
  },
  "fields": ["question_text"],
  "_source": false
}

逻辑说明:

  1. 基础查询用match_all,确保所有文档都参与计算;
  2. 第一个function负责计算向量相似度的基础得分;
  3. 第二个function通过filter筛选出含查询词的文档,给它们额外加固定权重;
  4. score_mode: sum将两部分得分相加,含查询词的文档总分更高,排名更靠前。

方案二:用bool+script_score叠加得分

如果想保留原来的more_like_this逻辑,也可以把它放到bool的should子句里,再在脚本中叠加得分:

{
  "query": {
    "script_score": {
      "query": {
        "bool": {
          "should": [
            {
              "more_like_this": {
                "fields": ["question_text"],
                "like": query_text,
                "min_term_freq": 1,
                "max_query_terms": 12,
                "minimum_should_match": "3<60%",
                "boost": 2.0  // 给匹配的文档预加权重
              }
            }
          ]
          // 无must约束,所有文档都能被返回
        }
      },
      "script": {
        "source": "cosineSimilarity(params.query_vector, 'question_vector') + 1.0 + _score",
        "params": {"query_vector": query_vector}
      }
    }
  },
  "fields": ["question_text"],
  "_source": false
}

逻辑说明:

  1. bool的should子句让more_like_this变成可选匹配,不匹配的文档也能进入结果集;
  2. boost参数给匹配的文档预加分;
  3. 脚本中把向量得分和_score(即should匹配的得分)相加,最终总分是两者的和。

注意事项

  • 余弦相似度的原始范围是[-1,1],加1后转为[0,2],避免出现负分影响排序;
  • 加分幅度(weight或boost的值)可根据实际业务需求调整,数值越大,含查询词的文档排名提升越明显;
  • 如果more_like_this的匹配规则太严格,也可以换成match查询(比如"match": {"question_text": query_text}),简化匹配逻辑。

内容的提问来源于stack exchange,提问作者BBloggsbott

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 06:52:49