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

相关推荐
Elasticsearch1 小时前
使用 Elasticsearch open inference API 对 OpenAI chat completions 进行支持
elasticsearch
Linux运维技术栈2 小时前
业务不停机、数据零丢失:Redis / RabbitMQ / Elasticsearch 三大核心中间件升级改造集群无缝平滑迁移
redis·elasticsearch·rabbitmq
Elasticsearch3 小时前
15 行点击跟踪代码,告诉你搜索日志无法揭示的信息
elasticsearch
Elastic 中国社区官方博客4 小时前
Elasticsearch:语义搜索快速入门
大数据·人工智能·elasticsearch·搜索引擎·全文检索
1名持续学习的码农15 小时前
GPT Plus、GPT Pro用户第一次用Codex,项目权限和Git分支怎么设置?
人工智能·git·gpt·elasticsearch·ai编程·codex
小罗水18 小时前
附录A 各微服务完整 application.yml 配置汇总
数据库·elasticsearch·微服务
Elasticsearch19 小时前
使用 Gemma、Hugging Face 和 Elasticsearch 构建 RAG 系统
elasticsearch
Elasticsearch20 小时前
使用 NVIDIA NeMo Retriever、Unstructured 和 Elasticsearch 处理非结构化数据
elasticsearch
Elasticsearch1 天前
使用 OpenAI 服务通过 Inference API 实现语义搜索
elasticsearch