You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Elasticsearch:基于doridat字段数值调整文档评分,实现最新PDF文档优先排序

解决方案:用function_score自定义评分逻辑

要实现你想要的「让doridat数值越高的文档评分越高,且仅attachment.content的匹配结果与doridat影响最终评分」的需求,Elasticsearch的function_score查询是完美的选择——它能在保留原始检索匹配评分的基础上,叠加自定义的加权规则,精准控制评分计算逻辑。

修改后的查询语句

GET /attachments/_search
{
  "size": 2,
  "from": 0,
  "query": {
    "function_score": {
      // 保留原有的wildcard检索逻辑,确保仅匹配attachment.content的文档被纳入结果
      "query": {
        "wildcard": {
          "attachment.content": {
            "value": "*berg*",
            "rewrite": "scoring_boolean"
          }
        }
      },
      // 添加基于doridat字段的评分加权规则
      "functions": [
        {
          "field_value_factor": {
            "field": "doridat",
            "factor": 1, // 可根据需求调整权重:数值越大,doridat对评分的影响越强
            "modifier": "none", // 直接使用doridat的原始数值,不做对数/平方等转换
            "missing": 0 // 若文档没有doridat字段,默认赋予0分
          }
        }
      ],
      // 定义原始匹配评分与自定义加权分的组合方式
      "boost_mode": "sum", // 把原始匹配分和doridat的加权分相加;若想让日期影响更显著,可改用"multiply"
      // 确保只有query和functions的评分影响最终结果,排除其他默认评分因素
      "score_mode": "sum"
    }
  },
  "highlight":{
    "fields":{
      "attachment.content":{}
    }
  },
  "_source": {
    "excludes": "attachment.content"
  }
}

关键逻辑说明

  • function_score的核心作用:先通过内层的query筛选出匹配attachment.content的文档,再对这些文档应用自定义的评分函数,最终的评分由原始匹配分加上(或乘以)doridat的加权分组成。
  • field_value_factor配置
    • field: "doridat":指定使用doridat字段的数值来计算加权分;
    • factor: 1:控制doridat对评分的权重,比如你觉得日期因素应该更重要,可以改成2,这样doridat的数值会被放大2倍后加入总分;
    • modifier: "none":因为doridat本身是代表日期的整数,数值越大越新,所以直接使用原始数值即可,不需要做任何转换;
  • boost_mode选择
    • "sum":原始匹配分 + doridat*factor,适合希望两个因素均衡影响的场景;
    • "multiply":原始匹配分 * doridat*factor,适合希望日期因素对高分文档的排名提升更明显的场景。

这样设置后,就完全符合你的需求:只有attachment.content的匹配结果和doridat的数值会影响最终评分,且doridat越大的文档评分越高,排名越靠前。

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

火山引擎 最新活动