Elastic script_score的使用

script_score介绍

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

script_score语法

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 案例

场景

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

索引创建

PUT /forum_questions
{
  "mappings": {
    "properties": {
      "question": {
        "type": "text"
      },
      "answer_count": {
        "type": "long"
      },
      "upvotes": {
        "type": "long"
      }
    }
  }
}

文档插入

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
}

查询

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"
    }
  }
}

相关推荐

  1. git使用

    2024-03-14 15:32:04       46 阅读
  2. websoket 使用

    2024-03-14 15:32:04       36 阅读
  3. Logstash使用方法

    2024-03-14 15:32:04       43 阅读
  4. Auth使用、缓存

    2024-03-14 15:32:04       37 阅读
  5. Eureka使用说明

    2024-03-14 15:32:04       42 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-14 15:32:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-14 15:32:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-14 15:32:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-14 15:32:04       20 阅读

热门阅读

  1. 代码即文档?

    2024-03-14 15:32:04       20 阅读
  2. 前端面试 ===> 【ES6】

    2024-03-14 15:32:04       18 阅读
  3. 突破编程_C++_设计模式(备忘录模式)

    2024-03-14 15:32:04       22 阅读
  4. 大带宽服务器租用 满足高速网络访问

    2024-03-14 15:32:04       22 阅读
  5. 服务器镜像是什么

    2024-03-14 15:32:04       20 阅读
  6. proxy和Object.defineProperty

    2024-03-14 15:32:04       22 阅读
  7. Linux 用户和用户组管理

    2024-03-14 15:32:04       17 阅读
  8. ubuntu22.04环境中安装pylint

    2024-03-14 15:32:04       17 阅读
  9. 高通qcm2290功耗问题

    2024-03-14 15:32:04       20 阅读
  10. 数据类型(面向对象)

    2024-03-14 15:32:04       16 阅读
  11. YOLOv8模型验证以及一些报错

    2024-03-14 15:32:04       16 阅读