ES中script脚本的使用

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: ES中script脚本的使用

一、script脚本的作用


通过使用脚本,可以在 Elasticsearch 计算自定义表达式。例如,可以使用脚本作为字段返回计算值,或者计算查询的自定义得分。


小结:

1、字段的提取

2、表达式计算


二、支持哪些script脚本语言


默认的脚本语言采用的是painless。

21.png


三、script脚本使用示例


1、查询中使用script脚本

PUT my-index-000001/_doc/1
{
  "my_field": 5
}
GET my-index-000001/_search
{
  "script_fields": {
    "my_doubled_field": {
      "script": { 
        "source": "doc['my_field'].value * params['multiplier']", 
        "params": {
          "multiplier": 2
        }
      }
    }
  }
}


2、创建单独的脚本

说明:

通过_scripts命令创建单独的脚本,并通过lang属性指定脚本的语言是painless。

source标签中,可以获取到索引文档中的值。

通过id指定脚本名称来使用独立的脚本。


创建脚本:


POST _scripts/calculate-score
{
  "script": {
    "lang": "painless",
    "source": "Math.log(_score * 2) + params['my_modifier']"
  }
}

获取脚本:

GET _scripts/calculate-score


使用脚本:

GET my-index-000001/_search
{
  "query": {
    "script_score": {
      "query": {
        "match": {
            "message": "some message"
        }
      },
      "script": {
        "id": "calculate-score", 
        "params": {
          "my_modifier": 2
        }
      }
    }
  }
}


删除脚本:


DELETE _scripts/calculate-score


3.通过脚本更新索引字段信息

PUT my-index-000001/_doc/1
{
  "counter" : 1,
  "tags" : ["red"]
}
POST my-index-000001/_update/1
{
  "script" : {
    "source": "ctx._source.counter += params.count",
    "lang": "painless",
    "params" : {
      "count" : 4
    }
  }
}


4.在mappings属性中定义运行时字段

查询的时候,可以直接使用mappings属性中定义的运行时字段day_of_week。

PUT my-index-000001/
{
  "mappings": {
    "runtime": {
      "day_of_week": {
        "type": "keyword",
        "script": {
          "source": "emit(doc['@timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ROOT))"
        }
      }
    },
    "properties": {
      "@timestamp": {"type": "date"}
    }
  }
}

5.在查询请求中定义运行时字段

如果没有在索引的mappings属性中定义运行时字段,那么也可以通过_search查询时,通过runtime_mappings来定义运行时字段。

GET my-index-000001/_search
{
  "runtime_mappings": {
    "day_of_week": {
      "type": "keyword",
      "script": {
        "source": "emit(doc['@timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ROOT))"
      }
    }
  },
  "aggs": {
    "day_of_week": {
      "terms": {
        "field": "day_of_week"
      }
    }
  }
}

6.使用脚本自定义计算得分

GET index/_search
{
  "query": {
    "script_score": {
      "query": {
        "match": { "body": "elasticsearch" }
      },
      "script": {
        "source": "_score * saturation(doc['pagerank'].value, 10)" 
      }
    }
  }
}


四、script脚本使用的安全性


1、脚本类型限制:script.allowed_types

Elasticsearch 支持2中类型的脚本: inline and stored.

可以通过在elasticsearch.yml配置文件中的script.allowed_types属性来指定允许执行的脚本类型。

相关配置选项:


both 同时支持inline和stored

inline 内联脚本

stored 存储脚本

none 都不支持


2、脚本上下文限制:script.allowed_contexts

默认情况下,所有脚本上下文都是允许的。使用 script.allowed_contexts 设置指定允许的上下文。若要指定不允许上下文,请将 script.allowe_contexts 设置为 none。


示例:允许脚本仅在评分和更新上下文中运行:


script.allowed_contexts: score, update


总结


本文主要介绍了ES中script脚本的使用。

其主要作用是:提取字段属性,进行表达式计算。

最典型的使用场景是:定义运行时字段。

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
9月前
|
JavaScript
node下的two.js调用one.js出现无法编译问题 Cannot find module ‘c:
node下的two.js调用one.js出现无法编译问题 Cannot find module ‘c:
85 0
|
9月前
|
JavaScript 前端开发 Shell
Node.js Shell 脚本开发指南(上)
Node.js Shell 脚本开发指南(上)
184 0
|
9月前
|
JavaScript 前端开发 Unix
Node.js Shell 脚本开发指南(中)
Node.js Shell 脚本开发指南(中)
156 0
|
小程序
小程序wepy踩坑-Cannot find module 'D:\node_modules\npm\bin\npm-cli.js'
小程序wepy踩坑-Cannot find module 'D:\node_modules\npm\bin\npm-cli.js'
266 0
|
5月前
|
JavaScript
ES6学习(9)js中的new实现
ES6学习(9)js中的new实现
|
6月前
|
存储 JavaScript 前端开发
Node.js的基本语法
【8月更文挑战第12天】Node.js的基本语法
227 1
Vue3,setup的使用需要搭配return进行使用,Vue3中带setup的script的标签和不带能不能合并到一起,export default不能放到setup里会报错,script
Vue3,setup的使用需要搭配return进行使用,Vue3中带setup的script的标签和不带能不能合并到一起,export default不能放到setup里会报错,script
|
9月前
|
SQL 存储 移动开发
结合ES6谈一下JS里面的find()方法的使用及注意事项
结合ES6谈一下JS里面的find()方法的使用及注意事项
88 0
|
9月前
|
JavaScript 前端开发 Unix
Node.js Shell 脚本开发指南(下)
Node.js Shell 脚本开发指南(下)
175 0
|
数据采集 JavaScript 前端开发
Node.js 中的 HTML 解析:技巧和最佳实践
在 Web 开发中,解析 HTML 是一个常见的任务,特别是当我们需要从网页中提取数据或操作 DOM 时。掌握 Node.js 中解析 HTML 的各种方式,可以大大提高我们提取和处理网页数据的效率。本文将介绍如何在 Node.js 中解析 HTML。