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

相关推荐
Elasticsearch2 天前
Elastic Observability 的跨项目搜索:通过一个查询搜索所有关联项目
elasticsearch
Elasticsearch2 天前
Elasticsearch 中的 agentic 工作流:暂停 AI agent 等待人工审批,72 小时后恢复
elasticsearch
Elastic 中国社区官方博客2 天前
jina-ocr-v1:在低成本 GPU 上实现更快速的文档解析
大数据·数据库·elasticsearch·搜索引擎·全文检索·jina
vx-程序开发3 天前
【计算机毕设】django校园跑腿服务系统83141
java·数据库·vue.js·spring boot·spring·elasticsearch·django
Elasticsearch3 天前
jina-ocr-v1:在低成本 GPU 上实现更快速的文档解析
elasticsearch
深海鱼肝油ya3 天前
向量数据库Elasticsearch(四)搜索文档——各种方式
人工智能·elasticsearch·向量数据库·es搜索文档·只能体·非结构化数据库
Elasticsearch3 天前
SNAP 支付错误检测:Elastic 如何帮助美国各州应对 FY2028 的处罚
elasticsearch
Elastic 中国社区官方博客3 天前
使用 Elasticsearch 和 Jina 进行 AI 视频搜索:精准找到你需要的视频片段秒数
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
Elasticsearch3 天前
2026 年唯一获得满分 Endpoint Prevention and Response(EPR)评分的是 Elastic
elasticsearch
Elasticsearch4 天前
没有小到无法记录的日志文件:Elastic Agent 如何跟踪低于 1 KiB 阈值的文件
elasticsearch