脚本相关改变

原文链接 : https://www.elastic.co/guide/en/elasticsearch/reference/5.0/breaking_50_scripting.html

译文链接 : http://www.apache.wiki/pages/viewpage.action?pageId=4260829

贡献者 : 片刻

切换默认语言从Groovy到Painless

Elasticsearch的默认脚本语言现在是Painless。 Painless是一种定制语言,语法类似于Groovy,旨在快速和安全。 许多Groovy脚本将与Painless脚本相同,以帮助使语言之间的过渡尽可能简单。

Painless的文档可以在无脚本语言中找到

Groovy和Painless之间的一个常见区别是使用参数 - Painless中的所有参数都必须以params为前缀。 现在。 以下示例显示了区别:

  1. {
  2. "script_score": {
  3. "script": {
  4. "lang": "groovy",
  5. "inline": "Math.log(_score * 2) + my_modifier",
  6. "params": {
  7. "my_modifier": 8
  8. }
  9. }
  10. }
  11. }

Painless(my_modifer的前缀为params):

  1. {
  2. "script_score": {
  3. "script": {
  4. "lang": "painless",
  5. "inline": "Math.log(_score * 2) + params.my_modifier",
  6. "params": {
  7. "my_modifier": 8
  8. }
  9. }
  10. }
  11. }

script.default_lang设置已删除。 不再可能设置默认脚本语言。 如果使用不同于无痛的语言,那么应该在脚本本身上明确指定。

对于没有定义明确语言的脚本,它们是已存储的渗透查询的一部分,可以使用script.legacy.default_lang设置来控制默认语言。

删除1.x脚本和模板语法

定义内联脚本/模板和引用文件或索引基础脚本/模板的已弃用的1.x语法已删除。

不能再使用脚本和params字符串参数,而必须使用脚本对象语法。 这适用于更新api,脚本排序,script_score函数,脚本查询,scripted_metric聚合和script_heuristic聚集。

因此,不再允许使用内联脚本:

  1. {
  2. "script_score": {
  3. "lang": "groovy",
  4. "script": "Math.log(_score * 2) + my_modifier",
  5. "params": {
  6. "my_modifier": 8
  7. }
  8. }
  9. }

并且必须使用此语法:

  1. {
  2. "script_score": {
  3. "script": {
  4. "lang": "groovy",
  5. "inline": "Math.log(_score * 2) + my_modifier",
  6. "params": {
  7. "my_modifier": 8
  8. }
  9. }
  10. }
  11. }

脚本或script_file参数不能再用于引用基于文件的脚本和模板,而必须使用文件。

引用基于文件的脚本的此用法不再有效:

  1. {
  2. "script_score": {
  3. "script": "calculate-score",
  4. "params": {
  5. "my_modifier": 8
  6. }
  7. }
  8. }

此用法有效:

  1. {
  2. "script_score": {
  3. "script": {
  4. "lang": "groovy",
  5. "file": "calculate-score",
  6. "params": {
  7. "my_modifier": 8
  8. }
  9. }
  10. }
  11. }

script_id参数不能再使用,请参考基于索引的脚本和模板,而必须使用id。

引用索引脚本的此用法不再有效:

  1. {
  2. "script_score": {
  3. "script_id": "indexedCalculateScore",
  4. "params": {
  5. "my_modifier": 8
  6. }
  7. }
  8. }

此用法有效:

  1. {
  2. "script_score": {
  3. "script": {
  4. "id": "indexedCalculateScore",
  5. "lang" : "groovy",
  6. "params": {
  7. "my_modifier": 8
  8. }
  9. }
  10. }
  11. }

模板查询

模板查询中的查询字段不能再使用。 此1.x语法不能再使用:

  1. {
  2. "query": {
  3. "template": {
  4. "query": {"match_{{template}}": {}},
  5. "params" : {
  6. "template" : "all"
  7. }
  8. }
  9. }
  10. }

而应使用以下语法:

  1. {
  2. "query": {
  3. "template": {
  4. "inline": {"match_{{template}}": {}},
  5. "params" : {
  6. "template" : "all"
  7. }
  8. }
  9. }
  10. }

搜索模板

搜索模板API中的顶级模板字段已替换为一致的模板/脚本对象语法。 此1.x语法不能再使用:

  1. {
  2. "template" : {
  3. "query": { "match" : { "{{my_field}}" : "{{my_value}}" } },
  4. "size" : "{{my_size}}"
  5. },
  6. "params" : {
  7. "my_field" : "foo",
  8. "my_value" : "bar",
  9. "my_size" : 5
  10. }
  11. }

而应使用以下语法:

  1. {
  2. "inline" : {
  3. "query": { "match" : { "{{my_field}}" : "{{my_value}}" } },
  4. "size" : "{{my_size}}"
  5. },
  6. "params" : {
  7. "my_field" : "foo",
  8. "my_value" : "bar",
  9. "my_size" : 5
  10. }
  11. }

索引的脚本和模板

索引脚本和模板已由存储脚本替换,这些脚本将脚本和模板存储在集群状态中,而不是专用的.scripts索引。

对于存储的脚本的大小,存在65535个字节的软限制。如果脚本超过该大小,则可以将script.max_size_in_bytes设置添加到elasticsearch.yml以将软限制更改为更高的值。如果脚本真的很大,应考虑其他选项,如本地脚本。

.scripts索引中以前建立索引的脚本将不再使用,因为Elasticsearch现在将尝试从群集状态获取脚本。升级到5.x后,.scripts索引将保持存在,因此脚本可以使用它来将存储的脚本从.scripts索引迁移到群集状态。脚本和模板的当前格式尚未更改,仅删除1.x格式。

Python迁移脚本

可以使用以下Python脚本将索引脚本作为存储脚本导入到集群状态:

  1. from elasticsearch import Elasticsearch,helpers
  2. es = Elasticsearch([
  3. {'host': 'localhost'}
  4. ])
  5. for doc in helpers.scan(es, index=".scripts", preserve_order=True):
  6. es.put_script(lang=doc['_type'], id=doc['_id'], body=doc['_source'])

此脚本使用官方Elasticsearch Python客户端,因此您需要确保您已在您的环境中安装了客户端。 有关这方面的更多信息,请参阅elasticsearch-py。

Perl迁移脚本

以下Perl脚本可用于将索引脚本作为存储脚本导入到集群状态:

  1. use Search::Elasticsearch;
  2. my $es = Search::Elasticsearch->new( nodes => 'localhost:9200');
  3. my $scroll = $es->scroll_helper( index => '.scripts', sort => '_doc');
  4. while (my $doc = $scroll->next) {
  5. $e->put_script(
  6. lang => $doc->{_type},
  7. id => $doc->{_id},
  8. body => $doc->{_source}
  9. );
  10. }

此脚本使用官方Elasticsearch Perl客户端,因此您需要确保您已在您的环境中安装了客户端。有关这方面的更多信息,请参阅Search :: Elasticsearch。

验证脚本迁移

在您通过提供的脚本或其他脚本移动脚本后,您可以验证与以下请求如果迁移成功发生:

  1. GET _cluster/state?filter_path=metadata.stored_scripts

响应应包括.scripts索引中的所有脚本。在验证所有脚本都已移动后,可以选择作为最后一步,您可以删除.scripts索引,因为Elasticsearch不再使用它。

索引脚本Java API

与索引脚本交互相关的所有方法都已删除。已在ClusterAdminClient类下添加了用于与存储的脚本进行交互的Java API方法。以前存在于索引脚本API方法上的糖方法不存在于存储脚本的方法上。提供脚本的唯一方法是使用BytesReference实现,如果需要提供字符串,则应该使用BytesArray类。

脚本引擎现在只注册一种语言

在5.0.0之前,脚本引擎可以注册多种语言。 Javascript脚本引擎特别注册了“lang”:“js”和“lang”:“javascript”。脚本引擎现在只能注册单一语言。对于lang-javascript插件的现有用户,所有对“lang”:“js”的引用应更改为“lang”:“javascript”。

脚本引擎现在只注册一个扩展

在5.0.0脚本引擎之前可以注册多个扩展。唯一的引擎是Javascript引擎,它注册了“js”和“javascript”。它现在只注册磁盘脚本的“js”文件扩展名。

.javascript文件不再受支持(使用.js)

Javascript引擎以前注册过“js”和“javascript”。它现在只注册磁盘脚本的“js”文件扩展名。

从update rest apiedit中删除脚本查询字符串参数

已从更新api中删除脚本script_id和scripting_upsert查询字符串参数。

Java传输客户端

TemplateQueryBuilder已移至lang-mustache模块。因此,当使用来自Java本机客户端的TemplateQueryBuilder时,lang-mustache模块应该在类路径上。此外,传输客户端应该将lang-mustache模块作为插件加载:

  1. TransportClient transportClient = TransportClient.builder()
  2. .settings(Settings.builder().put("node.name", "node"))
  3. .addPlugin(MustachePlugin.class)
  4. .build();
  5. transportClient.addTransportAddress(
  6. new InetSocketTransportAddress(new InetSocketAddress(InetAddresses.forString("127.0.0.1"), 9300))
  7. );

此外,创建TemplateQueryBuilder实例的QueryBuilders类中的帮助方法已被删除,而应使用TemplateQueryBuilder上的构造方法。

模板查询

模板查询已被弃用,支持搜索模板api。模板查询计划在下一个主版本中删除。

GeoPoint脚本

以下助手方法已从GeoPoint脚本中删除:

  • factorDistance
  • factorDistanceWithDefault
  • factorDistance02
  • factorDistance13
  • arcDistanceInKm
  • arcDistanceInKmWithDefault
  • arcDistanceInMiles
  • arcDistanceInMilesWithDefault
  • distanceWithDefault
  • distanceInKm
  • distanceInKmWithDefault
  • distanceInMiles
  • distanceInMilesWithDefault
  • geohashDistanceInKm
  • geohashDistanceInMiles

而是使用arcDistance,arcDistanceWithDefault,planeDistance,planeDistanceWithDefault,geohashDistance,geohashDistanceWithDefault,并使用适当的常数从默认单位(米)转换为所需单位(例如乘以0.001来转换为Km)。