木子李的个人博客

Good Luck To You!

Elasticsearch中的查询(查询四)权重算分

五、修改算分提升匹配度

5.1、function_score

假设我们的原始查询语句如下

GET zfc-doc-000001/_search
{
  "query": {
    "match": {
      "content": "es"
    }
  }
}

返回结果如下,ID为6的排在了第一位

image

如果我们想让ID为4的排在第一位如何修改查询语句呢,那么我们可以使用function_score来增加权重算分,比如使用title中匹配Elasticsearch

此处是为举例,要学习思想,以后工作中才有更好的思路

修改之后的查询语句如下

GET zfc-doc-000001/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "content": "es"
        }
      },
      "functions": [
        {
          "filter": {
            "term": {
              "title": "Elasticsearch"
            }
          },
        "weight":2
        }
      ],
      "score_mode": "multiply",
      "boost_mode": "multiply"
    }
  }
}

可以看到,显示结果已经发生改变,ID为4的算分已经高于ID为6的算分了

image

其中,query参数用于指定正常的查询语句,functions参数用于定义一个或多个函数来修改文档得分

score_modeboost_mode是用于控制function_score查询中如何计算文档得分和如何影响文档的排名的参数。

  • score_mode:参数用于指定多个函数如何组合计算得分。它支持以下取值:

    • multiply: 将所有函数的得分相乘

    • sum: 将所有函数的得分相加

    • avg: 将所有函数的得分求平均值

    • max: 取所有函数的最大得分作为文档得分

    • min: 取所有函数的最小得分作为文档得分

    • first: 取第一个函数的得分作为文档得分

    • weighted_sum: 将所有函数的得分相加,并乘以给定的权重系数。

  • boost_mode参数用于指定得分如何影响文档的排名。它支持以下取值:

    • multiply: 将得分与文档的原始得分相乘

    • replace: 使用得分替换文档的原始得分

    • sum: 将得分与文档的原始得分相加

    • avg: 将得分与文档的原始得分求平均值

    • max: 取得分和文档的原始得分的最大值作为文档得分

    • min: 取得分和文档的原始得分的最小值作为文档得分

请注意,score_modeboost_mode参数的取值会影响文档得分和排名的计算方式,需要根据具体的需求来选择合适的取值。另外,function_score查询中可以定义多个函数来修改文档得分,也可以使用weight函数来给定固定的分值,这些函数的组合和参数设置可能会对结果产生重要影响。

除了使用上述方式外,还可以使用如下几种方式进行算分的修改

5.2、Boosting

如下是匹配content字段中包含es的,对content中包含es的进行减分

GET zfc-doc-000001/_search
{
  "query": {
    "boosting": {
      "positive": {
        "term": {
          "content": "es"
        }
      },
      "negative": {
        "term": {
          "content": "玩转"
        }
      },
      "negative_boost": 0.5
    }
  }
}

5.3、Field Value Factor

需要注意的是,field_value_factor函数用于根据字段的数值进行打分计算,要求字段是数值类型的。

我们使用Field Value Factor来根据字段agreeNum的值对包含ES关键词的文档进行加权。使用log1p修饰符可以将字段值的对数应用于计算

GET zfc-doc-000001/_search
{
  "query": {
    "match": {
      "content": "ES"
    }
  },
  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    }
  ]
}
GET zfc-doc-000001/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "content": "ES"
        }
      },
      "field_value_factor": {
        "field": "agreeNum",
        "factor": 0.1,
        "modifier": "log1p"
      }
    }
  },
  "sort": [
    {
      "_score": {
        "order": "asc"
      }
    }
  ]
}

其中field_value_factor的参数含义如下

  • field: 要计算得分的字段名

  • factor: 一个乘数,用于缩放字段值的影响。可以使用任何非负数值。假如 factor的值是 0.1,表示字段值的影响将会被减小

  • modifier: 一个修饰符,用于对数值进行修改以调整得分

    • none:不应用任何修饰符,默认情况下为1

    • log:对计算结果取对数,以减少较大值的影响

    • log1p:与 log类似,但在计算结果前先加1,可以避免对0值进行对数运算

5.4、Script Score

我们可以使用script_score来自定义计算得分,此处仅为示例,具体可以根据自己的业务来修改。具体计算分可以通过explain来查看验证

GET zfc-doc-000001/_search
{
  "explain": true, 
  "query": {
    "function_score": {
      "query": {
        "match": {
          "content": "es"
        }
      },
      "script_score": {
        "script": {
          "source": "Math.log(doc['agreeNum'].value + 10)"
        }
      }
    }
  }
}

5.5、Decay Functions

我们使用Gauss衰减函数根据字段createTime的值来衰减文档的得分。在这个例子中,以2022-12-01为中心,每过10天,得分将衰减一半。参考结果可以使用下面两个查询语句对应

GET zfc-doc-000001/_search
{
  "query": {
    "match": {
      "content": "es"
    }
  }
}
GET zfc-doc-000001/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "content": "es"
        }
      },
      "functions": [
        {
          "gauss": {
            "createTime": {
              "origin": "2022-12-01",
              "scale": "10d"
            }
          }
        }
      ]
    }
  }
}


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2026年3月    »
1
2345678
9101112131415
16171819202122
23242526272829
3031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
    文章归档
    网站收藏
    友情链接

    Powered By Z-BlogPHP 1.7.3