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现在变为插件

以前_size作为表示索引文档时文档的json串的大小,现在已经被移除。可以通过安装插件实现:
./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"
        }
      }
    }
  }
}
  1. 这两个name字段在mapping中是有冲突的,将会阻止ES启动
  2. 这种情况下需要删除索引重新定义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" }
          }
        }
      }
    }
  }
}
  1. 字段只能通过title引用
  2. 字段只能通过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相关改变

  1. type名称不能以点“.”开头
  2. type名称不能超过255个字符
  3. 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













posted @ 2016-09-17 14:12  陈楠同学  阅读(182)  评论(0编辑  收藏  举报