elasticsearch5.0.0中聚合和脚本的变化

原创
2016/11/25 21:44
阅读数 2.3K

聚合的变化

聚合的变化,数字类型在新版本中进行了重构,采用了不同的数据结构,这种结构有更好的范围查询。然而,这种结构不参与文档评分操作。为了评估在后台的匹配文档的数量数字字段需要返回到运行的查询中,这可能会导致效率的降低。

如果这个数字字段需要进行排序,范围查询,统计聚合的时候,建议用keyword字段来代替数字字段。

IP范围聚合现在,Elasticsearch支持IPv6协议,ip地址在存储的时候用了二进制存储而不是用数字进行存储。因此IP聚合的时候将不在返回数字范围。

地理信息网格聚合的时候,将不再支持size: 0为零,新版本中要求size必须是大于零的数字。

时间值不在支持小数,例如1.5h将不在被支持,应该写成90m。

脚本的变化

系统默认的脚本语言从Groovy 到Painless。Painless脚本语言有类似Groovy的语法,被设计为更安全和更快。从Groovy 转到Painless是非常简单的。

Groovy和Painless在语法上有个显著的不同是使用参数上。所有的Painless参数必须有一个前缀,比如:

Groovy:

{
  "script_score": {
    "script": {
      "lang": "groovy",
      "inline": "Math.log(_score * 2) + my_modifier",
      "params": {
        "my_modifier": 8
      }
    }
  }
}

Painless (my_modifer is prefixed with params):

{
  "script_score": {
    "script": {
      "lang": "painless",
      "inline": "Math.log(_score * 2) + params.my_modifier",
      "params": {
        "my_modifier": 8
      }
    }
  }
}

 script.default_lang的设置被移除,因为系统不在支持默认其他脚本语言。如果要使用其他脚本语言,需要在请求的参数中显示的指出来。

本文由赛克 蓝德(secisland)原创,转载请标明作者和出处。

有部分已经存储的过滤查询是没有制定具体的脚本语言,这时候默认的语言由script.legacy.default_lang设置。

在1.X版本中定义的内联脚本/模板将被移除。基于脚本/模板的索引或者文件将被删除。

脚本和字符串参数将不再被使用,将使用脚本对象的语法来代替,这适用于update api, script sort, script_score function, script query, scripted_metric aggregation,script_heuristic aggregation。

内联脚本将不在被使用。

{
  "script_score": {
    "lang": "groovy",
    "script": "Math.log(_score * 2) + my_modifier",
    "params": {
      "my_modifier": 8
    }
  }
}

被替换成了下面的写法。

{
  "script_score": {
    "script": {
      "lang": "groovy",
      "inline": "Math.log(_score * 2) + my_modifier",
      "params": {
        "my_modifier": 8
      }
    }
  }
}

script和script_file参数将不在有效,由基于脚本或者模板的文件file来代替。

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

{
  "script_score": {
    "script": "calculate-score",
    "params": {
      "my_modifier": 8
    }
  }
}

现在是:

{
  "script_score": {
    "script": {
      "lang": "groovy",
      "file": "calculate-score",
      "params": {
        "my_modifier": 8
      }
    }
  }
}

script_id参数将不在被使用,由id来代替。

{
  "script_score": {
    "script_id": "indexedCalculateScore",
    "params": {
      "my_modifier": 8
    }
  }
}

现在是:

{
  "script_score": {
    "script": {
      "id": "indexedCalculateScore",
      "lang" : "groovy",
      "params": {
        "my_modifier": 8
      }
    }
  }
}

模板查询中的query参数将不在被使用,由inline参数代替。

{
    "query": {
        "template": {
            "query": {"match_{{template}}": {}},
            "params" : {
                "template" : "all"
            }
        }
    }
}

现在是:

{
    "query": {
        "template": {
            "inline": {"match_{{template}}": {}},
            "params" : {
                "template" : "all"
            }
        }
    }
}

搜索模板中的顶层模板template字段被替换为一致的模板/脚本对象语法。

{
    "template" : {
        "query": { "match" : { "{{my_field}}" : "{{my_value}}" } },
        "size" : "{{my_size}}"
    },
    "params" : {
        "my_field" : "foo",
        "my_value" : "bar",
        "my_size" : 5
    }
}

现在是:

{
    "inline" : {
        "query": { "match" : { "{{my_field}}" : "{{my_value}}" } },
        "size" : "{{my_size}}"
    },
    "params" : {
        "my_field" : "foo",
        "my_value" : "bar",
        "my_size" : 5
    }
}

索引脚本和模板

索引脚本和模板已被存储的脚本所取代,集群state中存储的脚本或者模板来代替.scripts索引。

存储脚本的默认大小不能超过65535个字节。可以通过script.max_size_in_bytes参数来修改这个值。如果脚本非常大,可以考虑用native scripts本地脚本来代替存储脚本。

以前存储在.scripts索引中的脚本将不能在使用,现在ES将在集群state中读取脚本。升级到5.X后,.scripts索引依然存在,如果要继续使用次脚本,需要将存储在.scripts中的脚本迁移到集群state中。两者的语法是一样的,不需要修改。

Python迁移脚本

下面的Python脚本可以用来导入索引脚本到群集state中存储:

from elasticsearch import Elasticsearch,helpers

es = Elasticsearch([
        {'host': 'localhost'}
])

for doc in helpers.scan(es, index=".scripts", preserve_order=True):
        es.put_script(lang=doc['_type'], id=doc['_id'], body=doc['_source'])

该脚本使用了官方Elasticsearch客户端因此你需要确保在环境中安装了客户端。

Perl的迁移脚本

下面的Perl脚本可以用来导入索引脚本到群集state中存储:

use Search::Elasticsearch;

my $es     = Search::Elasticsearch->new( nodes => 'localhost:9200');
my $scroll = $es->scroll_helper( index => '.scripts', sort => '_doc');

while (my $doc = $scroll->next) {
  $e->put_script(
    lang => $doc->{_type},
    id   => $doc->{_id},
    body => $doc->{_source}
  );
}

该脚本使用了官方Elasticsearch客户端因此你需要确保在环境中安装了客户端。

验证迁移脚本

当已经通过之前的脚本或以其他方式迁移了,可以用以下请求来验证,例如:

GET _cluster/state?filter_path=metadata.stored_scripts

响应应该包括.scripts索引中的所有脚本。当证明所有的.scripts索引都被移走了,可以删除.scripts索引。

java API索引脚本

所有与索引脚本交互的方法都已被删除。和存储脚本进行交互的java API的方法在clusteradminclient类中。如果一个字符串需要提供bytesarray类应用,则提供脚本的唯一途径是通过bytesreference实现。

脚本引擎现在只能有一种方式注册

在5.0.0之前,脚本引擎可以登记多方式。Javascript脚本语言可以登记为"lang": "js" 或者"lang": "javascript"。脚本引擎现在只能注册一个单一的语言,所有的"lang": "js"将被替换为"lang": "javascript"。

脚本的扩展文件名称只能有一种写法

之前脚本文件的扩展名有多种写法,比如"js" 和"javascript",现在所有的扩展文件名只能有js这一种写法。

.javascript文件后缀的方法将不在支持。

Update REST接口中删除了string参数。

cript, script_id 和scripting_upsert查询参数将被移除。

java传输客户

TemplateQueryBuilder类将被移除。

TransportClient transportClient = TransportClient.builder()
        .settings(Settings.builder().put("node.name", "node"))
        .addPlugin(MustachePlugin.class)
        .build();
transportClient.addTransportAddress(
        new InetSocketTransportAddress(new InetSocketAddress(InetAddresses.forString("127.0.0.1"), 9300))
);

在QueryBuilders类中创建TemplateQueryBuilder实例的方法被移除。TemplateQueryBuilder的构造函数现在可以使用。

模板查询接口将不建议使用,在下个版本中将移除。

在GeoPoint脚本中将移除以下方法。

factorDistance

factorDistanceWithDefault

factorDistance02

factorDistance13

arcDistanceInKm

arcDistanceInKmWithDefault

arcDistanceInMiles

arcDistanceInMilesWithDefault

distanceWithDefault

distanceInKm

distanceInKmWithDefault

distanceInMiles

distanceInMilesWithDefault

geohashDistanceInKm

geohashDistanceInMiles

用下面的方法进行代替。

arcDistance, arcDistanceWithDefault, planeDistance, planeDistanceWithDefault, geohashDistance, geohashDistanceWithDefault

本文由赛克 蓝德(secisland)原创,转载请标明作者和出处。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
7 收藏
1
分享
返回顶部
顶部