Elasticsearch2.x Breaking changes
移除的特性
Rivers已经移除
Elasticsearch不再支持rivers,因为和ES2.0的一些特性相冲突,比如:同步动态mapping更新。
具体原因:https://www.elastic.co/blog/deprecating-rivers
Facets已经移除
Facets在ES1.0时就已经被标记为deprecated,可以用更加灵活强大的 aggregation框架,这也意味着Kibana3不能在ES2.0下运行。
MVEL已经移除
MVEL脚本已经移除,默认的脚本语言现在是Groovy。
Delete-by-query现在变为插件
在ES1.X中delete-by-query非常快但是不稳定,他可能会导致主分片的文档和备份上的文档不同。而且有可能导致系统OOM最终导致宕机。
现在这个特性可以被scroll API和bulk API所代替,这样做可能会慢一点,但是更加安全。
目前有一些运行时间长的delete-by-query任务不能被取消,所以delete-by-query还是可以作为插件使用,安装插件方法
./bin/plugin install delete-by-query
Multicast Discovery(组播)现在变为插件
现在默认的发现机制是unicast(单播),作为默认设置ES会检查前5个端口。如果你还想继续使用组播功能,可以安装:./bin/plugin install discovery-multicast
_shutdown API
_shutdown api已经被移除并且没有其他替代的api,节点的管理可以通过操作系统和 start/stop脚本来实现。
murmur3现在变为插件
可以手动安装:
./bin/plugin install mapper-murmur3
_size现在变为插件
./bin/plugin install mapper-size
Bulk UDP
UDP API已经移除,现在只能使用标准的 bulk API。
Network changes(网络配置变化)
绑定localhost
ES2.X默认只绑定localhost,当然也会尝试绑定127.0.0.1(IPv4)和[::1](IPv6)。这个改变将阻止ES自动尝试连接你网络内的其他ES节点,除非你明确指定了ES节点地址。在生产环境你必须指定network.host参数。可以在elasticsearch.yml中配置或者在命令行启动参数中指定:
bin/elasticsearch --network.host 192.168.1.5 bin/elasticsearch --network.host _non_loopback_该参数的完整设置可参见:https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-network.html
Multicast removed(组播移除)
组播已经被移除(尽管可以通过插件实现)。当ES绑定localhost时会使用单播连接在transport.tcp.port指定的端口的前5个,默认配置是9300-9400。
这在开发阶段可以让开发人员做到0配置自动组成集群,但在生产环境需要提供一份单播的hosts列表,比如:
discovery.zen.ping.unicast.hosts: [ 192.168.1.2, 192.168.1.3 ]你不需要列出集群中所有的节点作为单播列表,但是你必须至少指定一定数量的具有被选举为master资格的节点地址。比如在一个有3个专用的master节点的大集群中,建议列出全部的这3个几点地址。
Mapping changes(映射变化)
冲突字段映射
在同一个索引的不同类型的同名字段中,是不允许出现不同映射(mapping)的。在以下几种参数中会抛出异常:copy_to、dynamic、enabled、ignore_above、include_in_al和properties。如下:
PUT my_index { "mappings": { "type_one": { "properties": { "name": { "type": "string" } } }, "type_two": { "properties": { "name": { "type": "string", "analyzer": "english" } } } } }
- 这两个name字段在mapping中是有冲突的,将会阻止ES启动
- 这种情况下需要删除索引重新定义mapping并重新索引。
ignore_conflicts也已经被移除,字段映射冲突将不会被忽略。
字段将不能再通过短名引用
字段不能在使用短名引用,必须指定全路径,比如:
PUT my_index { "mappings": { "my_type": { "properties": { "title": { "type": "string" }, <--- 1 "name": { "properties": { "title": { "type": "string" }, <--- 2 "first": { "type": "string" }, "last": { "type": "string" } } } } } } }
- 字段只能通过title引用
- 字段只能通过name.title引用
Type name prefix(类型名)前缀已移除
在ES1.X中,在url中不指定type可以在搜索字段名上指定前缀,如:GET my_index/_search { "query": { "match": { "my_type.some_field": "quick brown fox" } } }在ES2.X中,必须在url中指定type,搜索字段名上则不再加前缀:
GET my_index/my_type/_search { "query": { "match": { "some_field": "quick brown fox" } } }
字段名不再支持包含点“.”
在ES1.X中:PUT my_index { "mappings": { "my_type": { "properties": { "foo.bar": { "type": "string" }, "foo": { "properties": { "bar": { "type": "string" } } } } } } }foo.bar和bar是两个字段,在ES2.X foo.bar这种定义不再支持。
Type相关改变
- type名称不能以点“.”开头
- type名称不能超过255个字符
- type不能再被删除
Type元数据字段
元数据字段的配置项已经被移除,原因是为了他们更加稳定:
- _id字段将不能再被改变,如果需要按该字段排序需要使用_uid字段
- _type字段将不能再被改变
- _index字段将不能再被改变
- _routing配置必须明确指定需要开启
- _field_names配置仅限于disable字段
- _size
- _timestamp默认配置开启,使用默认格式
- _boost已经移除
- _analyzer已经移除
重要的一点是:元数据字段将不再能作为doc body的一部分指定。比如在ES1.X中:
PUT my_index { "mappings": { "my_type": { "_routing": { "path": "group" }, "properties": { "group": { "type": "string" } } } } } PUT my_index/my_type/1 { "group": "foo" }
在ES2.X中则改为:
PUT my_index { "mappings": { "my_type": { "_routing": { "required": true }, "properties": { "group": { "type": "string" } } } } } PUT my_index/my_type/1?routing=bar { "group": "foo" }
_timestamp和_ttl标记为deprecated
Analyzer映射
以前index_analyzer和search_analyzer可以分开设置,它们是平级的。现在只能设置analyzer和search_analyzer它们的关系是analyzer > search_analyzer,当在查询中不指定search_analyzer时默认采用analyzer指定的值。Boolean fields
以前bool字段采用string类型 F = false ,T = true,现在采用数字类型0 = false,1 = true