Elastic script_score的使用

script_score介绍

在Elasticsearch中,script_score是在function_score查询中的一种功能强大的方式,允许用户使用内置Painless脚本语言或者其他支持的语言来动态计算每个文档的评分

script_score语法

bash 复制代码
GET /<索引名>/_search
{
  "query": {
    "function_score": {
      "query": { "match_all": {} }, // 或者其它查询条件
      "functions": [
        {
          "script_score": {
            "script": {
              "source": """
                double customScore = 0;
                if (doc['field1'].value > params.threshold1) {
                  customScore += doc['field1'].value * params.multiplier1;
                }
                customScore += doc['field2'].value;
                return customScore;
              """,
              "params": {
                "threshold1": 50,
                "multiplier1": 0.5
              }
            }
          }
        }
      ],
      "score_mode": "sum", // 或者其它score_mode
      "boost_mode": "replace" // 或者其它boost_mode
    }
  }
}
  • script_score被用来定义一个脚本,该脚本计算文档的自定义评分
  • source字段内是Painless脚本,它可以访问文档中的字段值(如doc['field1'].value和doc['field2'].value)并对它们进行计算
  • params是一个键值对对象,用于传递给脚本的参数,此处定义了两个参数:threshold1和multiplier1

script_score 案例

场景

假设我们有一个问答论坛索引,需要基于回答数量和点赞数查找高质量

索引创建

bash 复制代码
PUT /forum_questions
{
  "mappings": {
    "properties": {
      "question": {
        "type": "text"
      },
      "answer_count": {
        "type": "long"
      },
      "upvotes": {
        "type": "long"
      }
    }
  }
}

文档插入

bash 复制代码
POST /forum_questions/_doc/
{
  "question": "What is Elasticsearch?",
  "answer_count": 5,
  "upvotes": 20
}

POST /forum_questions/_doc/
{
  "question": "How to configure Elasticsearch for production?",
  "answer_count": 3,
  "upvotes": 15
}


POST /forum_questions/_doc/
{
  "question": "Best practices for indexing data in Elasticsearch?",
  "answer_count": 10,
  "upvotes": 30
}

POST /forum_questions/_doc/
{
  "question": "How to optimize Elasticsearch performance?",
  "answer_count": 8,
  "upvotes": 18
}

POST /forum_questions/_doc/
{
  "question": "What are shards and replicas in Elasticsearch?",
  "answer_count": 6,
  "upvotes": 25
}

POST /forum_questions/_doc/
{
  "question": "How to handle time-based data in Elasticsearch?",
  "answer_count": 4,
  "upvotes": 12
}

POST /forum_questions/_doc/
{
  "question": "What is the difference between match and term queries?",
  "answer_count": 7,
  "upvotes": 23
}

POST /forum_questions/_doc/
{
  "question": "How to set up Elasticsearch clusters?",
  "answer_count": 9,
  "upvotes": 16
}

查询

bash 复制代码
GET /forum_questions/_search
{
  "query": {
    "function_score": {
      "query": { "match_all": {} }, // 或者使用具体查询条件
      "functions": [
        {
          "script_score": {
            "script": {
              "source": """
                double score = 0;
                score += doc['answer_count'].value * params.answer_weight;
                score += doc['upvotes'].value * params.upvote_weight;
                return score;
              """,
              "params": {
                "answer_weight": 0.7,
                "upvote_weight": 0.3
              }
            }
          }
        }
      ],
      "score_mode": "sum"
    }
  }
}
相关推荐
Karoku0663 小时前
【企业级分布式系统】ELK优化
运维·服务器·数据库·elk·elasticsearch
上优5 小时前
uniapp 选择 省市区 省市 以及 回显
大数据·elasticsearch·uni-app
jwolf27 小时前
Elasticsearch向量搜索:从语义搜索到图搜图只有一步之遥
elasticsearch·搜索引擎·ai
你可以叫我仔哥呀8 小时前
ElasticSearch学习笔记三:基础操作(一)
笔记·学习·elasticsearch
hummhumm9 小时前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
java1234_小锋12 小时前
Elasticsearch中的节点(比如共20个),其中的10个选了一个master,另外10个选了另一个master,怎么办?
大数据·elasticsearch·jenkins
Elastic 中国社区官方博客12 小时前
Elasticsearch 开放推理 API 增加了对 IBM watsonx.ai Slate 嵌入模型的支持
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
我的运维人生12 小时前
Elasticsearch实战应用:构建高效搜索与分析平台
大数据·elasticsearch·jenkins·运维开发·技术共享
Mephisto.java17 小时前
【大数据学习 | Spark】Spark的改变分区的算子
大数据·elasticsearch·oracle·spark·kafka·memcache
mqiqe17 小时前
Elasticsearch 分词器
python·elasticsearch