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

聚合的变化javascript

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

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

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

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

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

脚本的变化less

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

Groovy和Painless在语法上有个显著的不一样是使用参数上。全部的Painless参数必须有一个前缀,好比:函数

Groovy:ui

{
  "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)原创,转载请标明做者和出处。

相关文章
相关标签/搜索