Elasticsearch 自定义评分和脚本评分

在Elasticsearch中,默认的评分机制(如BM25算法)在大多数情况下能够提供良好的搜索结果排序。然而,在某些特定场景下,我们可能需要根据业务需求对搜索结果进行更精细化的排序。这时,Elasticsearch提供了自定义评分(Function Score Query)和脚本评分(Script Score)功能,以满足这些复杂需求。本文将详细介绍如何在Elasticsearch中自定义评分和脚本评分。

一、自定义评分(Function Score Query)

1.1 定义与原理

自定义评分允许我们根据一组预定义的函数来修改每个文档的默认评分。这些函数可以基于文档的字段值、查询条件或其他因素来计算新的评分。最终,Elasticsearch会将原始评分与自定义评分结合,以决定搜索结果的排序。

1.2 常用函数

Elasticsearch提供了多种内置函数用于自定义评分,包括但不限于:

  • weight:给所有匹配的文档指定一个统一的权重。
  • field_value_factor:根据文档中的字段值来计算评分。
  • random_score:为文档生成一个随机评分。
  • decay_function:根据文档与某个点的距离(如地理位置、时间等)来计算衰减评分,常见的衰减函数有高斯(gauss)、线性(linear)和指数(exp)等。
  • script_score:使用自定义脚本来计算评分。

1.3 示例

假设我们有一个电商网站,用户希望搜索商品时能够同时考虑商品的价格和评分。我们可以使用function_score查询来实现这一需求:

json 复制代码
GET /products/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "name": "手机"
        }
      },
      "functions": [
        {
          "field_value_factor": {
            "field": "price",
            "modifier": "reciprocal",
            "params": {
              "scale": 100
            }
          }
        },
        {
          "field_value_factor": {
            "field": "rating",
            "missing": 1.0
          }
        }
      ],
      "score_mode": "sum",
      "boost_mode": "replace"
    }
  }
}

在这个例子中,我们使用field_value_factor函数根据商品的价格和评分来计算自定义评分。价格使用了倒数衰减(reciprocal),使得价格越低的商品评分越高;评分则直接使用字段值。最终,我们将两个函数的评分相加,并替换原始评分。

二、脚本评分(Script Score)

2.1 定义与原理

脚本评分允许我们使用自定义的脚本语言(如Painless)来计算文档的评分。这种方式提供了最大的灵活性,可以根据几乎任何逻辑来计算评分。

2.2 示例

假设我们想要根据商品的库存数量来调整评分,库存越少的商品评分越高。我们可以使用script_score函数来实现这一需求:

json 复制代码
GET /products/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "name": "手机"
        }
      },
      "functions": [
        {
          "script_score": {
            "script": {
              "source": "Math.max(0, 1 - doc['stock'].value / 100.0)",
              "lang": "painless"
            }
          }
        }
      ],
      "score_mode": "multiply",
      "boost_mode": "replace"
    }
  }
}

在这个例子中,我们使用Painless脚本语言来计算评分。脚本根据商品的库存数量(doc['stock'].value)计算一个分数,库存数量越多,分数越低;库存数量越少,分数越高。然后,我们将这个分数与原始评分相乘,以调整最终的搜索结果排序。

三、总结

自定义评分和脚本评分是Elasticsearch提供的强大功能,它们允许我们根据业务需求对搜索结果进行精细化的排序。通过合理使用这些功能,我们可以提升用户体验,满足用户的多样化需求。然而,需要注意的是,自定义评分和脚本评分可能会增加查询的复杂性和计算成本,因此在实际应用中需要权衡利弊,谨慎使用。

相关推荐
一次旅行8 小时前
【效率秘籍】Shell 函数+别名组合拳,让 80% 的重复命令变 1 个字母
大数据·elasticsearch·搜索引擎
暖和_白开水8 小时前
数据分析agent(九):es_client_manager.py 和分词器ik_max_word问题
elasticsearch·数据分析·c#
码农学院8 小时前
Elasticsearch构建汽车零配件智能搜索与匹配系统
大数据·elasticsearch·汽车
Elastic 中国社区官方博客1 天前
不到 5 分钟完成本地部署:Jina embedding 模型现已支持本地部署
大数据·人工智能·elasticsearch·搜索引擎·embedding·jina
二进制流水搬运工1 天前
入职第一天拉了23个仓库,我写了个脚本解放双手
大数据·elasticsearch·搜索引擎
Elasticsearch1 天前
在不到一小时内将 Datadog Kubernetes 仪表板迁移到 Elastic Observability
elasticsearch
.柒宇.1 天前
Elasticsearch 核心概念与系统架构详解
elasticsearch·系统架构
风行無痕1 天前
单机Elasticsearch 8.19.18安全升级到9.4.3的过程
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客1 天前
使用重新设计的 AutoOps 更快地进行 Elasticsearch 问题排查
大数据·运维·前端·人工智能·elasticsearch·搜索引擎·全文检索
阿拉雷️1 天前
【搜索实战】Spring Boot 3.3 + AI Agent × Elasticsearch:让AI自动优化搜索策略,查询速度从2秒压到50毫秒
人工智能·spring boot·elasticsearch