ElasticSearch的REST APIs 之 索引的状态管理
基于ES7.7 官方文档
内容包括:
- 清空缓存 ( Clear cache )
- 更新索引以让新文档可以被搜索 ( Refresh )
- 将内存缓冲区中的文档写入磁盘 ( Flush )
- 同步Flush ( Synced flush )
7.6版本被弃用
- 强制合并 ( Force merge )
ES中
refresh
和flush
的区别: 参考官方博客 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
ElasticSearch的REST APIs 之 索引的状态管理相关推荐
- ElasticSearch的REST APIs 之 索引的别名(alias)管理
基于 ES 7.7, 官方文档 注意: 7.15版本中调整了分类, 把7.7版本中的Add和Update合并为"Create or Update", 更符合es api的定义 主要 ...
- elasticsearch 索引 red 状态恢复 green
ES集群状态.节点.索引及基本查询 一.elasticsearch 索引 red 状态恢复 green 错误原因 由于CPU占用过高或者有部分节点的分片不可用,未被分配: 解决: 重新分配未被分配的分 ...
- Elasticsearch索引生命周期管理方案
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 一.前言 在 Elasticsearch 的日常中,有很多 ...
- Elasticsearch是如何做到快速索引的
最近在参与一个基于Elasticsearch作为底层数据框架提供大数据量(亿级)的实时统计查询的方案设计工作,花了些时间学习Elasticsearch的基础理论知识,整理了一下,希望能对Elastic ...
- elasticsearch实战三部曲之一:索引操作
从本章开始,我们一起来实战elasticsearch,熟悉相关操作和命令,为后续的深入学习打好基础: 三部曲介绍 整个系列由以下三篇文章构成: 索引操作实战,也就是本文的主要内容: 文档操作实战: 搜 ...
- Elasticsearch-基础介绍及索引原理分析
介绍 Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 L ...
- Python读取多个excel文件(删除字段、数据格式转换、dataframe多表合并)并写入ElasticSearch实战(自动创建索引、写入ElasticSearch、探索性数据分析)
Python读取多个excel文件(删除字段.数据格式转换.dataframe多表合并)并写入ElasticSearch实战(自动创建索引.写入ElasticSearch.探索性数据分析) 目录
- 高效管理 Elasticsearch 中基于时间的索引——本质是在利用滚动模式做数据的冷热分离,热索引可以用ssd...
高效管理 Elasticsearch 中基于时间的索引 转自:http://stormluke.me/es-managing-time-based-indices-efficiently/ 用 Ela ...
- elasticsearch手动创建和删除索引
elasticsearch手动创建和删除索引 在ElasticSearch没有索引的情况下,插入文档,默认会自动创建索引和索引映射,从而无法使用ik分词器.因此需要手动创建索引,取消默认创建机制. / ...
- ElasticSearch Java Api(二) -检索索引库
一.准备数据 String data1 = JsonUtil.model2Json(new Blog(1, "git简介", "2016-06-19", &qu ...
最新文章
- 2019微信数据报告新鲜出炉!
- RabbitMQ学习总结(7)——Spring整合RabbitMQ实例
- python安装成功第三方库但import出问题_为什么会在pyspark在RDD中调用python第三方库失败?...
- xxx定律-poj-3782
- 此电脑怎么放在桌面上_window10桌面美化,真的是美爆了,高效整理电脑桌面
- JBoss OSGi用户指南(第二章:Getting Started)
- 实现二叉排序树的各种算法
- 修改csdn中字体颜色
- 数据结构笔记(二十五)-- 图的基本术语
- pandas表字段为空用其余表替换
- ftell函数的用法(用于获取指针位置)
- Axure RP 9.0.0.3687 正式版
- 最好吃的月饼!用Python爬取了某宝1166家月饼进行可视化分析!
- 2021-08-26小白笔记
- SQLSERVER、ORACLE中根据汉字获取拼音函数
- 《算法图解》-9动态规划 背包问题,行程最优化
- 2022年--读书笔记
- lightGBM简述
- 10019---CSS Grouping Selectors(分组和嵌套)
- NBA球员的选秀顺序和实际表现有多大差距?评估球员表现的VORP值又是怎么计算的?
热门文章
- 10246 - Asterix and Obelix
- 金士顿服务器内存条怎么看型号,区分内存条型号的方法
- 20145322 何志威《网络对抗》shellcode注入Return-to-libc攻击深入
- 架构整洁之道 (Clean Architecture )与领域模型与领域驱动设计(DDD)
- STM32硬核DIY机械键盘|蓝牙USB双模|灯控
- 网络营销渠道有什么特点?
- ARM920T的MMU与Cache ——转载
- LOJ-10102(桥的判断)
- css文本缩进两个字符,css如何设置首行缩进2个字符
- 联想裁员与全球化背景下的知识阶层失业