截至 2018-06-10 Elasticsearch6.2.4
Elasticsearch更新
- 通常滚动更新,具体升级方案需要参考官网。
- 小版本更新,可以一次对集群中的单节点滚动更新(不支持在非升级期间在集群中使用多个版本,新版本分片的更新不会复制到运行中的老版本节点上)
- 主要版本更新需要重启整个集群
- 跨主要版本升级不被支持
- 需要检查是否用到了deprecated的特性
- 需要检查各种插件(尤其是非官方的)的版本兼容性
- 需要备份数据(跨主要版本创建的索引的快照数据无法恢复,并且会阻止Elasticsearch启动),如果没有备份数据,将无法回滚到之前的版本,在升级到下一个主要版本之前,对上一个主要版本创建的索引,需要进行重建索引(或者删除),让其在下个主要版本可用。
- 在升级生产环境集群之前要先在开发环境下进行测试。
- 滚动更新的过程
- 关闭分片分配,关闭一个节点,重新分配分片需要大量的IO,当节点很快重新启动时,这些IO是不必要的,可以关闭节点前通过禁用分配时钟避免这个过程。
PUT _cluster/settings { "persistent":{ "cluster.routing.allocation.enable": "none" } }
- 停止非必要的索引,并且将数据刷入磁盘 在升级过程中,仍然会持续索引,当临时关闭非必要索引,并且进行synced-flush将缓存刷入后,分片的恢复速度会快很多。
POST _flush/synced
当执行synced flush时,应该检查响应结果,确认写入是否成功,响应体会列出由于索引期间由于失败而挂起的同步操作,而返回状态码仍然为200。如果失败了,重新提交请求。 - 关闭单节点
- 更新关闭的节点 根据原本的安装方式更新(RPM|Debian|.tar.gz),以.tar.gz包解压安装的要注意各种配置的设置(尤其是原本没有设置过数据路径时,要特别注意,ES_PATH_CONF,path.data,path.logs)。解压安装时目录中会包含config,data,logs和plugins目录,推荐将这些目录移动到Elasticsearch目录外,使他们不会在你升级Elasticsearch时被(失误)删除。使用ES_PATH_CONF环境变量和path.data,path.logs设定指定新的位置。用包管理工具安装,会将这些目录放到系统的合适位置。在生产环境,推荐使用包管理工具。
- 更新所有插件 使用elasticsearch-plugin 脚步更新所有安装的Elasticsearch插件版本。在更新一个节点时,所有的插件必须被更新。
- 启动更新了的节点 启动节点并确认已经加入集群,通过
GET _cat/nodes
请求确认。 - 重新启用分片分配
PUT _cluster/settings { "persistent":{ "cluster.routing.allocation.enalbe":null } }
- 等待节点恢复 在开始更新下一个节点之前,等待集群完成分片分配。可以通过
GET _cat/health
请求检查进度。等待status列从yellow变为green。一旦node为green,所有的主分片和复制分片都已经被分配。滚动更新时,分配到新版本节点上的主分片不会分配复制分片到老版本节点。如果不能分配复制分片到其他节点(集群中仅有一个更新的节点),复制分片会一直保持未分配,status会保持yellow。这种情况下,只要没有初始化或重定位分片,就可以继续(检查init和relo列)。一旦有其他节点被更新,复制分片可以被分配(需要有复制数的其他分片更新),状态会变为green。未sync-flushed的分片可能需要更长时间来恢复。可以通过GET _cat/recovery
请求监控独立分片的恢复状态。如果停止索引,一完成恢复就继续索引是安全的。 - 重复 当节点完成恢复,集群稳定后,对每个需要更新的节点重复这些步骤(更新整个集群)。在滚动更新期间,集群能够持续正常服务。然而,新的功能或向后的兼容模式操作在集群中所有节点完成更新之前仍不可用。一旦升级完成,所有节点在新的版本下运行,新的功能可被使用。一旦发生这种情况,就不能再回到一个向后兼容的模式。运行在之间主要版本的节点将无法加入完全更新的集群。在少见的情况下,升级过程期间出现网络故障,会将剩余的老节点从集群中隔离出来,这时必须离线升级这些老节点来使他们加入集群。
- 全集群重启升级
- 全集群重启升级需要关闭关闭集群所有节点,进行更新,然后重启集群。在从之前的主版本升级时需要进行全集群重启更新(上一个主要版本,跨主要版本时不允许直接更新)。
- 关闭分片分配
- 关闭索引并执行 synced flush
- 关闭所有节点
- 更新所有节点
- 更新所有插件
- 启动每一个被更新过的节点,如果有指定一些主要节点,在启用数据节点之前要最先启动他们,等待他们组成一个集群并选举出主节点。可以通过查看日志检查进度。一旦一个最小数量的主节点候选节点之间相互发现,他们将会组成一个集群并选举出一个主节点。在这时,就可以使用
GET _cat/health
GET _cat/nodes
请求检测加入集群的节点。 - 等待所有节点加入集群,集群状态被报告为yellow 所有的主分片被分配(可用),在所有主分片可用之前,不要打开分片(自动)分配。
- 重新打开分片分配,集群将复制分片分配给数据节点,这时,继续进行索引和搜索是安全的,但是如果能够等到所有主要和复制分片成功分配(所有节点状态为green),集群能更快恢复。可以通过
_cat/health
和_cat/recovery
api进行检测。
- 跨主要版本更新
- 本集群升级 (跨多个版本时需要进行多次)
- 在进行更新前对更早版本创建的索引重建索引或者删除。Elasticsearch能够读取前一个主版本创建的索引,更老的索引必须重建索引或删除。
- 进行全集群重启升级(多数时候)。
- 创建新版本集群,从远程集群直接导入索引
- 对于基于时间的索引,过老版本的索引通常随着时间流逝变得无用,并且在保留周期过去后被删除。除非有一个少见的长保留周期的(用途),否则可以等到所有老版本索引被删除后进行更新。
- 本集群升级 (跨多个版本时需要进行多次)
- (本集群)重建索引 使用reindex API重建老的索引
- 使用老索引相同的mappings和settings创建新索引
- 为了快速重建索引,可以设置
refresh_interval
为-1
,number_of_replicas
为0
- 使用 reindex API 将所有文档从老的索引重新索引到新的索引
- 重新设置
refresh_interval
和number_of_replicas
的值与老的索引中使用的相同 - 等待索引状态变为green
- 进行更新别名请求 删除老的索引 为新的索引添加老索引名的别名 添加所有老索引有的别名到新索引
- X-Pack 5.6 提供迁移辅助与更新工具,能够方便的重建索引并升级到6.x
- 从远端集群重建索引
- 创建一个新版本的与老集群独立的集群,通过设置
reindex.remote.whitelist: oldhost:httpport
来开启对老索引的访问 - 对于每一个需要迁移的索引
- 创建一个合适的mappings和settings的新索引,设置
refresh_interval: -1
,number_of_replicas: 0
来快速重建索引 - 从远端老索引获取文档重新索引到新索引,使用
POST _reindex
重建索引,如果设置wait_for_completion: false
让重建索引工作后台执行,reindex请求会返回一个 task_id ,可以通过使用 task API :GET _tasks/TASK_ID
检测重建索引工作进度 - 当重建索引工作完成后,设置
refresh_interval
和number_of_replicas
为希望的值(默认为30s(索引文档可读取时间)和1(复制分片数量)) - 当所有复制完成,新索引的状态变为green以后,可以删除老索引。
- 创建一个合适的mappings和settings的新索引,设置
- 创建一个新版本的与老集群独立的集群,通过设置
重大变化
- 聚合
- 移除 terms聚合中include/exclude的 pattern元素,替代为直接作为include/exclude的值
- date_range的from和to参数,现在依照format将总被解析为epoch_millis数值,其他如epoch_seconds的数值输入format,将不再可用。现在通过目标字段的format解析这些参数。如果mappings中的format不兼容数字输入值,一种兼容格式(如epoch_millis,epoch_second)必须在date_range聚合时指定,否则会抛出错误。
- 移除terms聚合中的 global_ordinals_hash 和 global_ordinals_low_cardinality,替代为global_ordinals(将在内部选择是否remap一个全局顺序到密集顺序或直接使用片段顺序)
- 分析
- 同义词token过滤器 Synonym Token Filter 将对任何分词器标记同义词,并且token filters 在链中在它之前, tokenizer 和 ignore_case 将被移除,在新的索引中使用时将被忽略。
- 限制高亮时分析text的长度,高亮text分析在搜索请求时在内存中实时处理,过大的texts,分析可能占用大量的时间和内存。为了防止这种情况,被分析的最大字符数将在下个主要版本限制为1000000。现在在超过这个数值的分析text时,会输出deprecation警告信息。这个限制可以通过对索引设定 index.highlightt.max_analyzed_offset 根据索引指定。
- cat API
- 现在在未限制cat线程池队列大小时,queue_size列会输出-1,保证总是输出一个数值。
- 客户端
- 从5.6.0版本起,一个新的客户端 the Java High Level REST Client 被发布。这个高级客户端,将使用与 TransportClient 使用的相同的核心Java类,能够用来执行 search, index, delete, update 和 bulk 操作。这个Java高级客户端被设计用来在不久的将来代替 TransportClient
- 集群
- 集群名称不再允许在path.data中使用(子目录)(现在path.data下应该直接为nodes目录)
- Document API
- 移除文档修改操作指定
version_type
为force
覆盖文档版本检查的操作 - 不再支持在 upsert 请求中添加一个
version
- 在 Index API 及 bulk 的 index 和 create 操作中,移除了
created
字段(元素),使用operation
字段代替。 - 在 Delete API 及 bulk 的 delete 操作中,移除了
found
字段,应该使用operation
字段代替。
- 移除文档修改操作指定
- Geo
- 移除了 ShapeBuilders 辅助类,现在必须使用 builder的构造函数代替(如 new MultiPointBuilder())
- 移除了 ShapeBuilder.parse 静态方法 使用 ShapeParser.parse 代替
- 索引(Indices)
- 索引模板使用
index_patterns
代替template
,可以在一个数组中定义多个glob风格的通配模式,对于单个通配模式,也支持直接使用一个字符串,两种方式都是有效的 - 移除影子复制分片(因为影子分片似乎并没有很大的用处)包括设定
index.shared_filesystem
,index.shadow_replicas
,node.add_lock_id_to_custom_path
- 当没有匹配的索引时,是否允许Open/Close index API 使用通配表达式的设定
allow_no_indices
的默认值从false改为true,与 Delete index API 一致。因此,当Open/Close index API 使用一个没匹配任何打开/关闭的索引的通配表达式时,不会返回一个错误。 - 删除一个文档 从一个不存在的索引中删除一个文档被改变为不会创建这个索引。然而,如果这个索引使用了外部版本控制,索引将被创建,而文档将被标记为删除。
- indices aliases api 仅针对索引解析索引表达式 update-aliases, put-alias 和 delete-alias API 不再接受别名作为参数,他将仅接受索引(或使用通配符扩充索引匹配)
- delete index api 仅针对索引解析索引表达式 delete index API 不再接受别名作为参数,仅接受索引名(或通配符匹配索引)
- 移除索引表达式的
+
(遗漏+
符号与使用具有相同效果,因此移除索引表达式中+
的支持) - 事物日志的存留 事物日志现在默认保持12小时,默认最大大小为512mb,并且不再在
flush
时删除,这是为了在请用一个复制加速时,基于操作的恢复的机会 - NGramTokenFilter与NGramTokenizer的最大值与最小值之间差异的限制 为了防止创建太多索引术语,最大最小值差被限制为1,默认限制可以通过设置
index.max_ngram_diff
改变,如果超过限制会产生警告日志 - ShingleTokenFilter最大最小值差异限制 为了防止创建过多tokens,默认限制ShingleTokenFilter最大最小值差值为3,默认限制可以通过堆索引设置
index.max_shingle_diff
属性改变,如果超过这个限制会输出警告日志
- 索引模板使用
- Ingest
- Timestamp元数据字段类型从java.lang.String 改变为 java.util.Date
- 字符串格式字段ingest.timestamp字段的格式改变 在之前需要使用
ingest.new_date_format
来让ingest.timestamp
元数据字段被格式化为ES可以不需要进一步转换强制使用date类型,限制不再需要这样了,而这个设置被移除,可以简单的通过在管线中设置一个字段到{{ingest.timestamp}}来获得date类型的字段而不会有任何mapping错误
- Java API
- setSource方法需要XContentType 之前
setSource
和其他方法接受字节/字符串对象源表示而不需要指定XContentType,自动侦测内容类型不再使用,当提供字节或一个字符串作为source时,这些方法现在需要指定XContentType作为额外的参数XContentType - DeleteByQueryRequest 需要一个明确设置的query 之前的Elasticsearch版本中,使用一个没有明确指定query的delete by query请求会被接受,将会使用 match_all 作为默认query,会导致所有的文档被删除,限制必须明确设定query
- 移除了InternalStats 和 Stats 的getCountAsString方法 如果有需要,改为使用String.valueOf(getCount())风格
- 使用ActionRequestBuilder#execute 返回ActionFuture 而不是 ListenableActionFuter 当通过requeste builder 发送一个请求时,他曾经可能针对ListenableActionFuture调用addListener。替代为返回ActionFuture,与Client方法返回一致,因此关联listeners与future不可行。在
execute
方法接受一个listener参数来替代 - Terms.Order 和 Histogram.Order 类使用 BucketOrder代替 terms, histogram 和 date_histogram 聚合代码被重构为使用公共排序桶代码。必须使用BucketOrder代替Terms.Order和Histogram.Order,直接使用内部排序实例,必须使用BucketOrder类的静态方法代替。
- 将getTookInMillis()从BulkResponse,SearchResponse和TermVectorsResponse中移除 使用getTook方法风格代替(getTook().getMillis())
- 使用DocumentField代替GetField和SearchHitField GetField和SearchHitField有相同的成员,同一使用DocumentField
- 一些聚合类移动到其他包 range聚合(geo_distance,date和ip)移动到org.elasticsearch.search.aggregations.bucket.range包 ,org.elasticsearch.search.aggregations.bucket.terms.support包中的类移动到org.elasticsearch.search.aggregations.bucket.terms,filter聚合类移动到org.elasticsearch.search.aggregations.bucket.filter
- PercentileRanksAggregationBuilder的构造器改变 现在需要在builder的构造器中明确的non-null,non-empty浮点数数组,而不是通过builder的setter,相应的移除了setter方法values()
- setSource方法需要XContentType 之前
- mapping
- 强制bool字段 在之前,Elasticsearch会解析字符串 true, false, on, off, yes, no, 0, 1 为布尔值,现在仅解析字符串 true 和 false 为布尔值,其他的则会跑出异常。为了向后兼容,6.x版本提前强制使用规则,而之前主要版本建立的索引仍能工作。这意味着你不需要立刻修改影响到的已存在的mappings,然而,通过一个已存在的违背严格boolean强制规则的索引模板建立索引是不可行的
- _all元字段默认改为不启用 在新的mappings中,包含了所有字段文本复制的
_all
元字段默认不启用,在之前使用_all字段进行搜索的query_string
和simple_query_string
现在将检查是否启用_all字段,并在_all字段禁用时执行跨越所有字段的query。_all
字段在Elasticsearch6.0之后创建的索引中将不再可以配置 - include_in_all mapping参数不再可用 由于新创建的mappings中禁用_all字段,
include_in_all
设置在这些索引中将不再可用 - 未识别的 match_mapping_type 选项不会silently ignored 先前的Elasticsearch会silently忽略包含不识别的
match_mapping_type
类型的动态模板,现在将会跑出一个未识别类型的异常 - 日期字段的locale验证 先前
date
字段的locale
选项允许几乎所有的字符串,未识别的值将会简单的被忽略,6.0之后在索引创建时未识别的值将被拒绝
- packaging
- 不再运行package配置custom用户与组 之前可以通过指定$ES_USER 和 $ES_CROUP 变量指定运行Elasticsearch的用户与群组,现在使用DEB和RPM包仅允许使用 elasticsearch 用户群组。如果要使用custom的用户或群组,要使用tarball方式安装Elasticsearch
- path.conf不再是一个可配置的设置 之前使用设定path.conf 作为设定,你能通过在启动Elasticsearch时通过指定path.conf,Elasticsearch应该使用另一个配置文件,这相当复杂。应该使用
ES_PATH_CONF
环境变量配置用户设定目录来替代 - 移除了默认path设定 在之前的版本中,允许使用
default.path.data
和default.path.logs
来设置没有被设定文件中的其他设定覆盖时的默认数据路径和默认日志路径。这些设定被移除了,现在数据路径和日志路径仅能通过设定配置,相应的,通过packagin scripts设定default.path.data和default.path.logs的环境变量DATA_DIR
和LOG_DIR
将不再生效。另外,这意味着如果你使用分发包(如通过RPM或DEB分发包安装安装),在之前没有明确指定path.data或path.logs,在迁移配置文件时,必须增加path.data
和path.logs
的设定。使用之前的默认值,需要添加两行设定path.data: /var/lib/elasticsearch
和path.logs: /var/log/elasticsearch
到elasticsearch.yml
文件中。如果已经指定了,需要保留他们。如果不这么做,Elasticsearch将无法启动 - 不再维护32位 Elasticsearch之前尝试确保Elasticsearch可以在32位JVM上启动(虽然引导检测会阻止在生产环境中使用一个32位JVM),将不再尝试维护他
- 在Windows service上不再过滤
-server
标记 与之前32位不再支持的改变相关,默认的jvm.option
文件不再包含-server
标记。先前,由于与服务不兼容,在Windows service将过滤 -server 标记。由于jvm.options文件不再包含 -server ,这个标记的过滤将在 Windows service 安装时移除,这意味着如果你的jvm.options文件包含这个标记,你需要移除他 - 不再支持
ES_JVM_OPTIONS
允许jvm.options文件自定义位置的环境变量 ES_JVM_OPTIONS 被移除,促使使用环境变量 ES_PATH_CONF。这个环境变量已经在packaging中用来支持配置文件的定位,所以这个改变只是让jvm.options文件与其他配置文件放在一起 - 不再支持ES_INCLUDE 环境变量 ES_INCLUDE 之前能够用来建立用来启动Elasticsearch的环境(和各种支持脚本)。当有几个环境变量用来配置JVM选项时,这个遗留特性是有用的,这个功能被 Setting JVM options 代替了,因此,移除了 ES_INCLUDE
- Percolator
- 弃用了percolator,删除了mpercolate apis 应该通过search 或者 msearch apis 来代替 percolate query
- 弃用了
percolator.map_unmapped_fields_as_string
设定 应该使用percolator.map_unmapped_fields_as_text
设定来代替
- Plugins https://www.elastic.co/guide/en/elasticsearch/reference/current/breaking_60_plugins_changes.html
- Mapper attachments 插件 mapper attachments plugin 在Elasticsearch5中启用,并在6中移除,可以使用 ingest attachment plugin 代替
- 忽略隐藏文件夹 先前的Elasticsearch版本在扫描插件时会跳过隐藏文件和文件夹,现在被移除了
- ICU Analysis plugin icu4j库更新到了59.1,为了让前面主要版本创建的索引返回正确(并正确排序)的结果,需要重建索引,并利用新的字符
- 插件不应该从Settings构建
Environment
实例 以前,允许从Settings构建一个Environment实例来发现特定插件的配置文件,在所有Settings
对象没有包含正确设定的配置路径的必要信息时将不适用。相反,需要知道配置路径的插件应该有一个接受Settings
和Path
实例的构造函数,通过使用Environment上适当的构造函数构造一个Environment - 亚马逊、微软、谷歌云计算相关插件
- S3 Repository plugin(亚马逊AWS 对象存储S3) https://www.elastic.co/guide/en/elasticsearch/plugins/6.2/repository-s3.html
- Azure Repository plugin(微软Azure) https://www.elastic.co/guide/en/elasticsearch/plugins/6.2/repository-azure.html
- GCS Repository plugin(google云存储) https://www.elastic.co/guide/en/elasticsearch/plugins/6.2/repository-gcs.html
- EC2 Discovery plugin(亚马逊云服务器EC2) https://www.elastic.co/guide/en/elasticsearch/plugins/6.2/discovery-ec2.html
- Reindex
size
参数 size参数不能再指定为-1。如果需要所有的文档,那么不应该设置size参数
- REST
- Unquoted JSON 在以前的版本,JSON文档允许包含一些未用引号的字段名,并不是一个严格的JSON,并且会导致一些ELasticsearch客户端断开,所以这个特性被移除了
- 在JSON,CBOR,Yaml和Smile中重复的键 在之前的Elasticsearch版本中,文档允许包含重复的键,Elasticsearch6.0强制所有的键唯一,应用于所有的内容类型:JSON、CBOR、Yaml和Smile
- Content-Type Auto-detection 在Elasticsearch以前的版本中,不强制要求请求中适当的内容类型(Content-Type),在Elasticsearch6.0强制所有带有请求体的请求必须包含一个支持的内容类型,这种类型将用来解析数据。当在
source
查询字符串参数时,同样要指定source_content_type
参数指定源媒体类型 - Boolean API parameters 所有的REST APIs 的参数(包括请求参数和JSON body)对boolean只提供
false
和true
作为值,所有其他的值将导致一个错误 - Analyze API 使用请求参数和请求体中纯文本(text/plain)的请求方式被移除了,使用JSON文本参数
- Analyze API中自定义归一化(标准化 normalizer)支持 Analyze API 能够分析normalizer和自定义normalizer,在以前的版本,Analyze API 需要一个
tokenizer
或者analyzer
参数,在Elasticsearch6.0,如果设定了char_filter/filter并且没有设定tokenizer/analyzer,Analyze API 能够分析文本为自定义标准化关键字字段 - 索引请求的timestamp和ttl 在index/update请求中,timestamp和ttl参数将不再接受
- 在Refresh请求中有一个或更多分片失败时将返回Http500响应取代200状态码 Refresh请求广播到多个分片,期间至少有一个分片失败时将会用响应500来代替响应200
- Delete by Query API 需要一个明确的query 在之前,一个没有明确的query的通过query删除请求会被接受,会导致使用match_all删除所有文档,在Elasticsearch6.0起,delete by query 请求需要一个明确的query
- DELETE document 调用现在隐式创建type 运行
DELETE index/type/id
当type不存在时,现在会通过default mapping隐式创建type - Indices information APIs 以前能通过执行
GET /_aliases,_mappings
或GET /myindex/_settings,_alias
使用逗号分割多种请求类型获取一个或多个索引的多种类型信息,逗号分割获取多种信息片段的用法已经被移除了。使用GET /_all
获取所有索引 aliases,settings,mappings 信息。使用GET /myindex/_mapping|_alias|_settings
获取一个索引对应信息 - 使用不适当的HTTP方法请求一个存在的端点现在返回405响应 使用不适当的HTTP请求方法(如一个POST请求到/myindex/_settings)将返回一个HTTP405响应来代替404。一个
Allow
头将被添加到405响应中,包含允许的方法(动作) - 禁止_cache和_cache_key的使用 现在请求中的
_cache
和_cache_key
选项被完全移除了,使用他们将抛出一个错误 - IndexClosedException返回400状态码 当设定
ignore_unavilable
为false时,对一个关闭的索引调用所有在关闭的索引上不支持的api,将返回一个IndexClosedException
,响应状态码将从403改变为400
- Scripting
- 移除Groovy,JavaScript和Python语言 移除Groovy,JavaScript和Python脚本语言,使用painless代替
- Native scripts removed 移除了本地脚本,通过
implement a ScriptEngine
代替 - Date字段现在返回dates
doc.some_dete_field.value
现在返回ReadableDateTime
来取代epoch以来毫秒数的long值。doc.some_date_field[some_number]
也是一样。如果有需要,使用doc.some_date_field.value.millis
来获取epoch以来的毫秒数 - 移除内部访问索引的_index变量
_index
变量现在被移除了,如果你需要用他来进行高级排序,考虑写一个Similarity
插件 - Script Settings 移除了所有现有的脚本安全设定,使用
script.allowed_types
和allowed_contexts
代替 - 当使用stored script作为请求的一部分时,不能再指定
lang
不能再指定lang
变量为使用了stored script的请求的一部分,否则会出现一个错误。注意一个使用了stored script的请求与puts一个stored script的请求是不同的。脚本的语言已经作为集群状态的一部分储存,执行stored script使用id
已经可以获取所有必要的信息 - 在putting|getting|deleting一个stored script时不能再使用
lang
在使用_scripts/
路径执行PUT|GET|DELETE动作的stored script时,不能再指定lang参数为url的一部分。所有的stored scripts必须有一个唯一的id
作为命名空间,现在仅有id
而不再有lang
和id
- 移除了Stored search template apis 移除了PUT|GET|DELETE 的
_search/template
apis,使用带store search templates的stored script api来代替
- Search and Query DSL
- changes to queries
- 移除了
span_near
query的collect_payloads
参数,payloads将在需要时加载 - 现在严格解析boolean字段的值,即仅字符串"true"和"false"能被解析为他们对应的bool值,其他字符串将抛出一个异常
- 移除了
in
query(与terms
query类似) - 移除了
geo_bbox
query(与geo_bounding_box
query类似) - 移除了
mlt
query(与more_like_this
query类似) - 移除了
more_like_this
query的like_text|ids|docs
参数(都与like
类似),min_word_len
(与min_word_length
类似),max_word_len
(与max_word_length
类似) - 移除了
fuzzy_match
和match_fuzzy
query(与match
query类似) - terms query现在总是返回1,并且不再是
indices.query.bool.max_clause_count
的主体 - 移除了
indices
query - 从query DSL中移除了堆空查询对象(
{ }
)的支持,当使用一个空查询对象时将会抛出一个异常 - bool query的
minimum_number_should_match
被移除,应该使用minimum_should_match
代替 - 现在
query_string
query在使用max_determinized_states
将允许正确解析最大状态数量 - query_string query不再接受
enable_position_increment
,使用enable_position_increments
代替 - 对与
geo_distance
查询、排序和聚合,在distance_type
参数中移除了sloppy_arc
选项 - 移除了
geo_distance_range
query - 在
geo_distance
query中移除了optimize_bbox
参数 - 从
geo_bounding_box|geo_polygon|geo_distance
query中移除了ignore_malformed|coerce
参数 - 从
bool|common_terms
queries中移除了disable_coord
参数,如果提供了,将被无视并输出弃用警告 - 移除了
template
query - 废弃了
percolate
query的document_type
,不能再指定document_type
参数 - query_string query的
split_on_whitespace
参数,如果提供了,会输出废弃警告。query_string query现在仅使用操作符分割 - 移除了query_string query中的
use_dis_max
参数,必须使用tie_breaker
参数代替 - 移除了query_string query的
auth_generate_phrase_queries
参数,使用明确引用的query - 移除了
query_string
和simple_query_string
的all_fields
参数,使用设置default_field
为`代替,如果提供了,default_field会自动设置为 - terms过滤器中的
index
参数现在是强制的(用来在专门的索引中查找terms),在之前,index默认为执行query的index,现在index必须在请求中明确设定 - 在
match
query中的type
和slop
参数被移除了,使用match_phrase
或match_phrase_prefix
来代替设置type
。从match
移除了slop
但是在match_phrase
和match_phrase_prefix
支持了 - 移除了
match_phrase
query的phrase_slop
参数(与slop
参数相似) - 移除了
constant_score
query中的query
参数(与filter
参数相似) - 从multi_match query中移除了
phrase_slop
参数(与slope
参数相似) - 从
prefix
query中移除了prefix
参数(与value
参数相似) - 从
range
query中移除了le
(与lte
相似)和ge
(与gte
相似) - 移除了
ids
query中与type
相似的types
和_type
参数 - 移除了与
constant_score
相似的constant_score_auto
和constant_score_filter
- 移除了
- Search shards API search shards API不再接受
type
url参数 - Profile API
time
字段显示人类可读的时间输出被显示使用纳秒数的time_in_nanos
字段代替,可以通过在请求url中加上?human=true
打开time
字段,将会显示取整的人类可读的时间值 - Scoring changes
- Query normalization 移除了query normalization。这意味着TF-IDF相似不再尝试产生通过across queries生成比较分,boosts现在现在作为简单的乘法因子集成到分数中。其他相似性不会被影响,因为他们没有进行分值归一化并且已经将boosts作为乘法因子集成到分数中了,通过LUCENE-7347查看更多信息 https://issues.apache.org/jira/browse/LUCENE-7347
- Coordination factors 从评分公式中移除了coordination factors。这意味着boolean queries不再基于匹配的条件数量评分,相反,他们总是返回子句的总分。因此,现在不鼓励使用TF-IDF相似度作为产生相似性分值质量的重要组件。推荐使用BM25来代替。通过LUCENE-7347查看更多信息 https://issues.apache.org/jira/browse/LUCENE-7347
_uid
字段数据 废弃了_uid
字段数据,可以改为使用_id代替,而他(_id)仍没有被启用的原因是因为在random_score
function中被使用(没有设定一个seed字段时,默认会用_id,但会消耗大量内存,不设定seed字段的用法弃用)。如果你真的需要获取文档id来排序、聚合或搜索,推荐冗余id作为文档的一个字段- 高亮
unified
高亮时新的默认高亮选择。这个补偿策略对每个字段高亮依赖于字段类型(index_options)内部精选。强制指定fvh
或plain
类型的高亮仍是可用的。postings
高亮从Lucene和Elasticsearch中移除了。当index_options
选项设置为offsets
时,unified
高亮输出同样的highlighting - fielddata_fields 移除了
fielddata_fields
,应该用docvalue_fields
代替 - docvalue_fields
docvalue_fields
现在默认最多请求100字段,可以通过使用index.max_docvalue_fields_search
索引设定覆盖 - script_fields
script_fields
现在默认请求最大限制32个script fields,可以通过使用索引设定index.max_script_fields
设定 - Inner hits 内部hits命中的source保持相对于整个source的相对路径,在最早的版本,source字段会关联到内部hit
- Scroll 在开始一个scroll时,不再接受一个from参数,这个参数在这种情况已经被无视了,现在增加一个错误抛出
- top hits、inner hits的from/size限制 通过top hits,inner hits允许取回的最大值(from+size)被限制为100,这个限制可以通过
index.max_inner_result_window
索引设置控制 - 废弃Scroll queries中的request_cache的使用 设置
request_cache:true
到一个查询中会创建一个scroll('scroll=1m')现在废弃了,这个请求将不会使用内部缓存在未来版本将会用400代替仅提示忽略。Scroll queries的缓存没有意义 - 限制Terms Query请求中可以使用的terms数量 执行一个有大量terms的Terms Query可能降低集群的性能,每个附加的term需要额外的处理和内存。为了保护这种情况,一个Terms Query中能用的最大数量限制为65536。可以通过在指定索引中改变索引设定
index.max_terms_count
来改变默认最大值
- changes to queries
- Settings changes
- 移除了elasticsearch.json和elasticsearch.yaml配置文件支持 之前会寻找Elasticsearch配置目录下.yml|.yaml|.json拓展名的文件,现在仅支持elasticsearch.yml
- 配置文件中重复keys 以前允许配置文件中包含重复的keys,在Elasticsearch6.0,不再允许,必须指定一个single key,如
node: name: my-node attr: rack: my-rack
- 强制boolean设定 Elasticsearch6.0仅解析
true
和false
为boolean,其他的会抛出异常,为了向后兼容,在Elasticsearch6.0之前建立的索引仍能工作。注意这不会应用到存储在elasticsearch.yml中的节点级别设定 - Snapshot settings 内部设定
cluster.routing.allocation.snapshot.relocation_enabled
允许分片运行重新分配到其他节点被移除的snapshots。启用此设定,在分片分配到其他节点,然后在快照运行时重新分配到此节点可能会引发问题 - Store throttling settings Store throttling 被移除了,因此集群设定
indices.store.throttle.type
和indices.store.throttle.max_bytes_per_sec
及索引设定index.store.throttle.type
和index.store.throttle.max_bytes_per_sec
将不再解析 - Store settings 默认的
index.store.type
被移除了,如果你在使用他,单纯的将他从你的索引设定中移除,Elasticsearch会使用对于你操作系统最好的store
实现 - Network settings 阻塞的TCP客户端,阻塞的TCP服务端以及阻塞的HTTP服务端被移除,因此,
network.tcp.blocking_client
,network.tcp.blocking
,transport.tcp.blocking_client
,transport.tcp.blocking_server
和http.tcp.blocking_server
设定将不再解析,之前未使用的设定transport.netty.max_cumulation_buffer_capacity
,transport.netty.max_composite_buffer_components
和http.netty.max_cumulation_buffer_capacity
被移除了 - Similarity settings
base
相似现在作为调整被忽略,query normalization现在被移除,如果提供了,会忽略设定并给出一个废弃警告 - Script Settings 所有现有的脚本安全性设定被移除了,使用
script.allowed_types
和script.allowed_contexts
来代替 - Discovery Settings
discovery.type
不再支持gce|aws|ec2
值,这些平台的集成应该通过设置discovery.zen.hosts_provider
为他们的值 - Stats and info changes
- 移除了store stats中的
throttle_time
由于存储阈值被移除了,store stats将不再报告throttle_time - FS stats将不再报告磁盘是否旋转 从2.x开始,Elasticsearch默认会判断是否在SSDs上运行,如上,Elasticsearch不再需要从文件系统收集是否每个数据路径的基本磁盘是否旋转。他在ES2.x开始不再需要,用来维护节点状态API中文件系统分区。这个信息现在移除了
- 移除了store stats中的
- 6.1
- 引导检测应用到本地连接地址 之前,当Elasticsearch bind到localhost时,会bind到回路设备的所有地址,包括 link-local addresses 如macOS上的 fe80::1%lo0。从6.1.2开始,Elasticsearch将仅bind到回路设备的回路地址。所以现在,当Elasticsearch没有bind到localhost时,引导检测会应用于link-local addresses
- 6.2
- 所有权限的引导检测 Elasticsearch安装了一个安全管理器,来减少漏洞的范围,对JDK、第三方依赖、Elasticsearch本身提供像不被信任的插件一样的沙盒环境。自定义的安全策略和单个权限可以添加到策略
java.security.AllPermission
。但是,这实际上相当于禁用了安全管理器。因此,在生产模式下现在通过all permission bootstrap check 禁止授权 - 私有临时目录 在Linux,之前的版本进程使用默认临时目录/tmp,然而/tmp时公开的,所以Elasticsearch选择改变packaging使用一个私有临时目录。如果是从之前的版本升级的,并且保持了之前存在的jvm.options,应该添加一行
-Djava.io.tmpdir=${ES_TMPDIR}
指定临时目录,在所有的操作系统上这样操作都是安全的 - GC日志 从Elasticsearch6.2.0开始,JVM GC日志是开箱即用的。这种轻量级的设备可以了解GC问题。这些设定在jvm.options中,(默认64M轮替,最多32个,约2G)保存到默认日志目录。如果从之前的版本更新,并且保留原有的jvm.options,应该添加GC日志设定来获取有价值的调试信息。如果是使用packaging distributions,使用默认的日志位置为/var/log/elasticsearch,从tarball安装默认使用logs/gc.log,否则,在日志文件中设定绝对路径
- Rollover alias 在Elasticsearch6.2.0或之后,如果在匹配索引模板时找到同样的别名,rollover请求将被中止。这个变化是为了在rollover期间保护指向多索引的别名。如果你的索引模板已经包含了同样的别名,你应该通过更新索引模板移除他
- 所有权限的引导检测 Elasticsearch安装了一个安全管理器,来减少漏洞的范围,对JDK、第三方依赖、Elasticsearch本身提供像不被信任的插件一样的沙盒环境。自定义的安全策略和单个权限可以添加到策略