ElasticSearch的REST APIs 之 索引的状态管理

原创
2021/11/08 22:53
阅读数 141

基于ES7.7 官方文档

内容包括:

  • 清空缓存 ( Clear cache )
  • 更新索引以让新文档可以被搜索 ( Refresh )
  • 将内存缓冲区中的文档写入磁盘 ( Flush )
  • 同步Flush ( Synced flush ) 7.6版本被弃用
  • 强制合并 ( Force merge )

ES中refreshflush的区别: 参考官方博客 https://blog.csdn.net/UbuntuTouch/article/details/103641544

1. 清空缓存 (Clear cache API)

清空一个或多个索引的缓存。官方文档

POST /<index>/_cache/clear

路径参数

<index>

  (可选, string) 支持多个逗号连接的多个索引名称或者通配符表达式。

请求参数

allow_no_indices

  (可选, bool) 默认true。如果设置为true, 则当全部使用通配符*_all只检索不存在(missing)或者已关闭(closed)的索引(或索引别名)时,会抛出错误。

expand_wildcards

  (可选, string) 通配符查询时的范围限制。支持多个条件以逗号分割。默认open

  • all: 匹配open和closed的索引, 包括隐藏的.
  • open: 默认, 表示只查询开放中的索引
  • closed: 只匹配closed的索引
  • hidden: 隐藏的(hidden)索引, 必须和open/closed联合使用.
  • none: 不接受通配符.

fielddata

  (可选, bool) 如果为true, 则清空字段的缓存。与参数fields一起使用,仅清空指定字段的缓存。

fields

  (可选, string) 支持多个字段名的逗号拼接。与参数fielddata一起使用,仅清空指定字段的缓存。默认是所有字段。

不支持对象和字段别名

index

  (可选, string) 支持多个索引名称的逗号拼接。

ignore_unavailable

  (可选, bool) 如果为true,则 返回数据中不会包含missing或closed的索引。默认false,查询时只要有一个索引不存在,就会返回404并抛出错误信息。

query

  (可选, bool) 如果为true,清空查询缓存(query cache)。

request

  (可选, bool) 如果为true,清空请求缓存(request cache)。

几个栗子

1、清空指定类型的缓存 (Clear a specific cache)

默认情况下,这个/_cache/clear API会清空所有缓存。如果只想清空指定的缓存, 可以把下面的几个参数设置为true

  • fielddata
  • query
  • request
# 仅清空字段的缓存
POST /<index>/_cache/clear?fielddata=true

# 仅清空查询缓存
POST /<index>/_cache/clear?query=true

# 仅清空请求缓存
POST /<index>/_cache/clear?request=true

2、清空指定字段的缓存

使用参数fields来指定要清空的字段,支持多个字段的逗号连接

# 仅清空字段 field1 和 field2 的缓存
POST /<index>/_cache/clear?fields=field1,field2

3、清空多个索引的缓存

#清空索引 index1 和 index2 的所有缓存
POST /index1,index2/_cache/clear

4、清空所有索引的缓存

POST /_cache/clear

# 下面两个不常用
POST /_all/_cache/clear
POST /*/_cache/clear

2. 更新索引以让新文档可以被搜索 ( Refresh API )

刷新一个或多个索引,以使新的文档可以被搜索。官方文档

# 刷新指定的索引
POST|GET /<index>/_refresh

# 刷新当前集群中的所有索引
POST|GET /_refresh

使用这个api可以显式的对一个或多个索引执行刷新(refresh)操作,使得自上次refresh操作以来的对该索引的所有操作(文档更新等)可以被搜索到。

默认情况下,ES以1秒为周期刷新索引,但仅针对在过去30秒内收到一个或多个搜索请求的索引。可以通过修改配置index.refresh_interval来改变这个默认配置。

刷新是资源密集型的操作。 为了确保良好的集群性能,建议等待Elasticsearch的周期性刷新,而不是在可能的情况下执行显式刷新。
如果您的应用程序工作流操作了文档(比如新增/修改文档),然后(立即)搜索该索引,我们建议在使用index API的查询参数中使用refresh=wait_for来确保请求会先等待一个索引定期refresh的时间, 等索引刷新完毕, 再执行搜索。

路径参数

<index>

  (可选, string) 支持索引名称的英文逗号分割的列表或通配符表达式。如果要刷新当前集群的所有索引, 可以使用_all*或直接忽略这个参数。

查询参数

allow_no_indices

  (可选, bool) 默认true。如果设置为true, 则当全部使用通配符*_all只检索不存在(missing)或者已关闭(closed)的索引(或索引别名)时,会抛出错误。

expand_wildcards

  (可选, string) 通配符查询时的范围限制。支持多个条件以逗号分割。默认open

  • all: 匹配open和closed的索引, 包括隐藏的.
  • open: 默认, 表示只查询开放中的索引
  • closed: 只匹配closed的索引
  • hidden: 隐藏的(hidden)索引, 必须和open/closed联合使用.
  • none: 不接受通配符.

ignore_unavailable

  (可选, bool) 如果为true,则 返回数据中不会包含missing或closed的索引。默认false,查询时只要有一个索引不存在,就会返回404并抛出错误信息。

栗子

1. 刷新多个索引

# 刷新指定的几个索引
POST /index1,index2,index3/_refresh

# 刷新指定前缀的索引
POST /index*/_refresh

2. 刷新当前集群的所有索引

POST /_refresh

# 下面两个不常用
POST /_all/_refresh
POST /*/_refresh

3. 将内存缓冲区中的文档写入磁盘 ( Flush API )

对一个或多个索引执行Flush操作。 官方文档

POST|GET /<index>/_flush
POST|GET /_flush

索引的flush操作,是确保当前只存储在事务日志(transaction log / translog)中的任何数据被永久存储在Lucene索引中的过程。 当重新启动时,ES将所有未刷新(unflushed)的操作从事务日志中重放到Lucene索引中,使其恢复到重启之前的状态。Flush 会定期触发,也可以在 Translog 达到特定大小时触发,这些设置可以防止 Lucene频繁提交(就是flush)带来的不必要的开销。

这些机制与mysql很像

一旦每个操作被flush,它就会永久存储在Lucene索引中。 这可能意味着不需要在事务日志中维护它的额外副本,除非出于其他原因保留它。 事务日志由多个文件组成,称为版本(generations),一旦不再需要任何版本文件,ES将删除它们,释放磁盘空间。

也可以使用 flush API 在一个或多个索引上触发flush操作,尽管用户很少需要直接调用这个API。 如果在索引一些文档之后调用flush API,返回成功状态则表明ES已经刷新(flush)了在调用该api之前所有被索引的文档。

路径参数

<index>

  (可选, string) 支持索引名称的英文逗号分割的列表或通配符表达式。如果要flush所有索引, 可以忽略这个参数或者使用_all*

查询参数

allow_no_indices

  (可选, bool) 默认true。如果设置为true, 则当全部使用通配符*_all只检索不存在(missing)或者已关闭(closed)的索引(或索引别名)时,会抛出错误。

expand_wildcards

  (可选, string) 通配符查询时的范围限制。支持多个条件以逗号分割。默认open

  • all: 匹配open和closed的索引, 包括隐藏的.
  • open: 默认, 表示只查询开放中的索引
  • closed: 只匹配closed的索引
  • hidden: 隐藏的(hidden)索引, 必须和open/closed联合使用.
  • none: 不接受通配符.

force

  (可选, bool) 如果设置为true, 即使没有索引没有任何变更需要提交(commit)也会强制执行一次flush操作。默认true

  可以使用此参数来增加事务日志(translog)的版本号(generation number)。

  此参数被视为内部参数。

ignore_unavailable

  (可选, bool) 如果为true,则 返回数据中不会包含missing或closed的索引。默认false

wait_if_ongoing

  (可选, bool) 如果为true,则该flush操作会等待另外一个正在执行的flush操作。

  如果为false,则当有另外一个flush操作在执行时, ES会抛出错误。

  默认true

几个例子

1、 flush指定的一个索引

POST /myindex/_flush

2、 flush多个索引

POST /myindex,order_2021/_flush
POST /order*/_flush

3、 flush当前集群的所有索引

POST /_flush

# 下面两种不常用
POST /_all/_flush
POST /*/_flush

4. 同步Flush (Synced flush)

synced-flush从ES 7.6版本开始弃用,8.0版本会移除!使用flush代替. 从7.6版本开始, flush与synced flush效果相同。

#! Deprecation: Synced flush is deprecated and will be removed in 8.0. Use flush at _/flush or /{index}/_flush instead.

POST|GET /<index>/_flush/synced
POST|GET /_flush/synced

本节内容省略, 如有需要参考官方文档 synced-flush


5. 强制合并 (Force merge API)

强制合并一个或多个索引的分片。

POST /<index>/_forcemerge

通过将分片中的一些段(segment)合并到一起,减少了分片中段的数量,还释放了已删除文档所占用的空间。 合并通常是自动进行的,但有时手动触发合并也是有用的。

Warning! 强制合并只应该在索引写入完成后被调用。 强制合并可能导致产生非常大的段(>5GB),如果你继续对这样的索引进行写操作,那么自动合并策略将永远不会考虑这些段是否需要合并,直到段中大部分都是已删除的文档。 这可能会导致索引中保留非常大的段,从而导致磁盘使用增加和搜索性能下降。

强制合并操作引起的阻塞问题 (Blocks during a force merge)

调用这个API会导致阻塞,直到合并操作完成。 如果客户端在操作完成之前丢失连接,强制合并进程仍将在后台继续执行。 任何新的强制合并同一个索引的请求也将被阻塞,直到正在进行的强制合并完成。

强制合并多个索引

强制合并API可以在一次调用中同时操作多个索引,甚至可以使用_all操作所有索引。 一个节点一次可以执行一个分片的多个索引操作。 强制合并使得被合并的分片的存储空间临时增加,在max_num_segments参数设置为1的情况下,最大可以增加到两倍的大小,因为所有的段都需要重写到一个新的段。

ES 7.15文档 中有提及: 默认每个节点只有一个fore_merge线程。如果想在一个节点上同时对多个分片进行强制合并,则需要增大此线程数。

路径参数

<index>

  (可选, string) 支持索引名称的英文逗号分割的列表或通配符表达式。如果要flush所有索引, 可以忽略这个参数或者使用_all*

查询参数

allow_no_indices

  (可选, bool) 默认true。如果设置为true, 则当全部使用通配符*_all只检索不存在(missing)或者已关闭(closed)的索引(或索引别名)时,会抛出错误。

expand_wildcards

  (可选, string) 通配符查询时的范围限制。支持多个条件以逗号分割。默认open

  • all: 匹配open和closed的索引, 包括隐藏的.
  • open: 默认, 表示只查询开放中的索引
  • closed: 只匹配closed的索引
  • hidden: 隐藏的(hidden)索引, 必须和open/closed联合使用.
  • none: 不接受通配符.

flush

  (可选, bool) 如果为true, 则ES在强制合并后执行flush操作。默认true

ignore_unavailable

  (可选, bool) 如果为true,则 返回数据中不会包含missing或closed的索引。默认false

max_num_segments

 (可选, integer) 段合并的目标数量(要把索引的所有的段合并成几个段)。如果要完全合并索引,请设置为1。默认会检查是否需要执行合并(比如原来就是一个segment,你发命令告诉es再合并成一个segment,那es就认为不需要执行合并了),如果需要则执行之。

only_expunge_deletes

  (可选, bool) 如果为true, 仅删除包含有已删除文档的段。默认false

  在Lucene中,段中的文档并没有被真正删除,只是做了个已删除的标记而已。在合并过程中,会创建一个新的不包含删除文档的段。

该参数不会覆盖index.merge.policy.expunge_deletes_allowed设置。

几个栗子

1、强制合并一个索引

POST /myindex/_forcemerge

2、强制合并多个索引

POST /myindex,customers/_forecemerge
POST /orders*/_forecemerge

3、强制合并所有索引

POST /_forcemerge

# 下面两个不常用
POST /_all/_forcemerge
POST /*/_forcemerge

4、基于时间的索引 (Time-based indices)

强制合并对基于时间的索引很有用, 特别是使用rollover时。 在这些情况下,每个索引只在一段时间内接收索引流量。 一旦索引不再接收到写操作,它的分片就可以被强制合并为一个段。

# 把索引强制合并为一个段
POST /logs-000001/_forcemerge?max_num_segments=1

This can be a good idea because single-segment shards can sometimes use simpler and more efficient data structures to perform searches.

这会是一个好主意,因为只有一个段的分片有时可以使用更简单和高效的数据结构来执行搜索。

last updated at 2021/11/8 22:55

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部