本文记录工作中常用的关于 Elasticsearch 的 HTTP 接口,以作备用,读者也可以参考,会持续补充更新。开发环境基于 Elasticsearch v5.6.8、v1.7.5、v2.x。
集群状态
集群信息
1 | http://localhost:9200/_cluster/stats?pretty |
可以看到整个集群的索引数、分片数、文档数、内存使用等等信息。
健康状况
1 | http://localhost:9200/_cat/health?v |
可以看到分片数量,状态【红、黄、绿】。
空间使用
查询每个节点的空间使用情况,预估数据大小:
1 | http://localhost:9200/_cat/allocation?v |
分片分布
1 | http://localhost:9200/_cat/shards |
索引状态
可以看到索引的数据条数、磁盘大小、分片个数【可以使用别名】。
各项指标解释说明参考:indices-stats 。
1 | http://localhost:9200/your_index/_stats |
集群配置信息
1 | http://localhost:9200/_cluster/settings?pretty |
对于一些可以设置的参数,临时生效,对于集群的管理很有帮助。
例如节点黑名单:cluster.routing.allocation.exclude._ip,临时下线节点,类似于黑名单,分片不会往指定的主机移动,同时会把分片从指定的节点全部移除,最终可以下线该节点,可通过 put transient 设置临时生效。
1 | curl -XPUT 127.0.0.1:9200/_cluster/settings -d '{ |
例如临时关闭分片重分配【开启时设置值为 all】。
1 | curl -XPUT 127.0.0.1:9200/_cluster/settings -d '{ |
设置整个集群每个节点可以分配的分片数,主要是为了数据分布均匀。
1 | GET _cluster/settings |
设置慢索引阈值,指定索引进行操作,可以使用通配符:
1 | curl -XPUT 127.0.0.1:9200/your_index_*/_settings -d '{ |
设置慢查询阈值方式类似:
1 | curl -XPUT 127.0.0.1:9200/your_index_*/_settings -d '{ |
推迟索引分片的重新分配时间平【适用于 Elasticsearch 节点短时间离线再加入集群,提前设置好这个参数,避免从分片的复制移动,降低网络 IO】。
1 | PUT /your_index/_settings |
可以使用索引别名、通配符设置,这样就可以一次性设置多个索引,甚至全部的索引。
热点线程
查看热点线程,可以判断热点线程是 search,bulk,还是 merge 类型,从而进一步分析是查询还是写入导致 CPU 负载过高。
1 | http://localhost:9200/_nodes/node0/hot_threads |
请求队列
查看请求队列情况,可以看到每种类型请求的积压情况:
1 | http://localhost:9200/_cat/thread_pool?v |
节点配置信息
可以查看节点的 JVM 配置、插件信息、队列配置等等。
1 | http://localhost:9200/_nodes/node_id |
注意,thread_pool 线程池相关参数自从 v5.x 以后不支持动态设置【即通过 put 接口】,只能通过更改节点的配置文件并重启节点来操作,这也说明了这个参数是对于节点生效,不同配置的节点可以设置不同的值。
使用堆内存大小
使用
1 | http://localhost:9200/_cat/fielddata |
查看当前集群中每个数据节点上被 fielddata 所使用的堆内存大小。
此外还可以指定字段
1 | http://localhost:9200/_cat/fielddata?v&fields=uid&pretty |
按照节点、索引来查询:
1 | 按照索引、分片 |
清理缓存
1 | curl localhost:9200/index/_cache/clear?pretty&filter=false&field_data=true&fields=_uid,site_name |
推迟索引分片的重新分配时间
适用于节点短时间离线再加入集群,提前设置好,避免从分片的复制移动。
1 | PUT your_index/_settings |
排除掉节点
不让索引的分片分配在上面,想取消设置为 null 即可。
1 | # 索引级别的 |
基于负载的智能路由查询
v6.2 以及以上版本,search 智能路由设置,v7.0 以及以上版本默认开启。
1 | PUT /_cluster/settings |
查询全局超时时间
search 全局超时时间,避免某些耗时的查询把集群拖垮。
1 | search.default_search_timeout |
查询时指定分片主机等
1 | preference=_shards:8,12 |
分片迁移的并发数带宽流量大小等等
1 | # 并发数 |
只读索引问题
在集群机器的磁盘快用完之前,集群会自动设置这台机器上面的节点的索引为【只读模式】,不可写入,写入直接拒绝并抛出异常信息。
1 | 20/10/10 19:02:44 ERROR ESBulkProcessor: {"index":"your_index_name","type":"post","id":"12aad31610551fb2e236367bbde01db7","cause":{"type":"exception","reason":"Elasticsearch exception [type=cluster_block_exception, reason=blocked by: [FORBIDDEN/12/index read-only /allow delete (api)];]"},"status":403} |
此时,除了清理数据,还需要手动设置。
1 | GET your_index_*/_settings |
参考官方文档:cluster.routing.allocation.disk.watermark.flood_stage 。
分析器
可以查看不同分析器的分词结果,或者基于某个索引的某个字段查看分词结果。下面列举一些例子,其它更多的内容请读者参考另外一篇博客:Elasticsearch 分析器使用入门指南 。
查看集群安装的各种分词器效果,指定文本内容、分词器即可:
1 | POST _analyze |
查看某个索引的某个字段的分词器效果【索引已经指定分词器,可以通过 mapping 查看】,指定索引名称、文本内容、字段名称,不要指定索引的 type,否则请求变为了新建文档:
1 | POST my-index-post/_analyze |
查询时也可以指定分词器【不同分词器会影响返回的结果,例如 standard 分词器会过滤掉标点符号,所以查不到数据】,特别指定分词器即可。另外只能使用 match,不能使用 match_phrase。
1 | POST my-index-post/post/_search |
创建索引
创建带 mapping 的索引:
1 | PUT /my-index-post/ |
创建带 mapping 的 type【在索引已经存在的情况下】:
1 | PUT /my-index-post/_mapping/post/ |
更新索引的 mapping【在索引、类型都已经存在的情况下】:
1 | PUT /my-index-post/_mapping/post |
添加删除别名
给索引增加别名:
1 | POST /_aliases |
移除索引的别名:
1 | POST /_aliases |
导入数据
1 | 把文件中的数据导入索引,批量的形式 |
bulk 接口,详情参考另外一篇博客: 使用 Elasticsearch 的 bulk 接口批量导入数据 。
查询数据
脚本查询
Elasticsearch 提供了脚本的支持,可以通过 Groovy 外置脚本【已经过时,v6.x 以及之后的版本,不建议使用】、内置 painless 脚本实现各种复杂的操作【类似于写逻辑代码,对数据进行 ETL 操作,需要集群配置开启】。
以下是关于 v2.x 的说明:
默认的脚本语言是 Groovy,一种快速表达的脚本语言,在语法上与 JavaScript 类似。它在 Elasticsearch v1.3.0 版本首次引入并运行在沙盒中,然而 Groovy 脚本引擎存在漏洞,允许攻击者通过构建 Groovy 脚本,在 Elasticsearch Java VM 运行时脱离沙盒并执行 shell 命令。
因此,在版本 v1.3.8、1.4.3 和 v1.5.0 及更高的版本中,它已经被默认禁用。此外,您可以通过设置集群中的所有节点的 config/elasticsearch.yml 文件来禁用动态 Groovy 脚本:script.groovy.sandbox.enabled: false,这将关闭 Groovy 沙盒,从而防止动态 Groovy 脚本作为请求的一部分被接受。
1 | Groovy 脚本 |
日期桶聚合
对日期格式的字段做桶聚合,可以使用 interval 设置桶间隔,使用 extended_bounds 设置桶边界,其它还可以设置时区、doc 过滤等。
1 | "aggs": { |
对于聚合结果不准的问题,可以增加参数,适当提高准确性。size 参数规定了最后返回的 term 个数【默认是 10 个】,shard_size 参数规定了每个分片上返回的个数【默认是 size * 1.5 + 10】,如果 shard_size 小于 size,那么分片也会按照 size 指定的个数计算。
聚合的字段可能存在一些频率很低的词条,如果这些词条数目比例很大,那么就会造成很多不必要的计算。因此可以通过设置 min_doc_count 和 shard_min_doc_count 来规定最小的文档数目,只有满足这个参数要求的个数的词条才会被记录返回。min_doc_count:规定了最终结果的筛选,shard_min_doc_count:规定了分片中计算返回时的筛选。
1 | "aggs": { |
更新文档
指定部分字段进行更新,不影响其它字段【但是要注意,如果字段只是索引 index 而没有存储 _source,更新后会无法查询这个字段】。
1 | POST /my-index-user/user/0f42d65be1f5287e1c9c26e3728814aa/_update |
自动缓存相关
terms lookup 查询:
1 | 自动缓存 |
操作缓存的接口:
1 | 关闭缓存 |
多层嵌套反转桶聚合
多层聚合查询,关于嵌套、反转,参考:nested-aggregation 。
1 | POST combine-paas-1003-index/2723-data/_search |
统计个数聚合
对于多篇文章,统计每个站点下面的作者个数:
1 | -- 多层嵌套以及特殊的聚合,每个 site_name 下面的作者个数统计 |
存在查询
exists、missing 这两类查询在不同的版本之间使用方式不一致。
1 | -- 存在、不存在判断条件,1.7.5 版本和 2.3.4 版本的方式不一样 |
随机取数
随机取数【需要 ES 集群支持脚本请求】
1 | GET your_index_name/_search |
如果 ES 集群不支持脚本请求,会抛出异常:illegal_argument_exception,原因:cannot execute [inline] scripts。
删除数据
根据查询条件删除数据:
1 | POST my-index-post/post/_delete_by_query/ |
当然,如果是低版本的 Elasticsearch,在 1.x 的版本中还可以使用发送 DELETE 请求的方式删除数据,容易引发一些操作失误,不建议使用。
更多内容参考:Elasticsearch 根据查询条件删除数据的 API 。
索引关闭开启
主要有两个接口:
- 开启索引,
curl -XPOST http://localhost:9200/your_index/_open - 关闭索引,
curl -XPOST http://localhost:9200/your_index/_close
参考这篇博客的部分内容:使用 http 接口删除 Elasticsearch 集群的索引 。
迁移数据
迁移一个索引的数据到另外一个索引,切记需要提前创建好索引,包含 mapping,避免字段类型出问题:
1 | POST _reindex |
此外,参考:Elasticsearch 的 Reindex API 详解 ,里面包含了常见的参数使用方式,以及查看迁移任务进度、取消迁移任务的方式。
移动分片
需要先关闭 rebalance,再手动移动分片,否则由于手动迁移分片造成集群进行分片的重新分配,进而消耗 IO、CPU 资源。手动迁移分片完成之后,再打开 rebalance,让集群自行进行重新分配管理。
临时参数设置:
1 | 关闭 |
分片的迁移使用:
1 | move:移动分片 |
注意,allocate 命令还有一个参数,"allow_primary" : true,即允许该分片做主分片,但是这样可能会造成数据丢失【在不断写入数据的时候】,因此要慎用【如果数据在分配过程中是静态的则可以考虑使用】。
当然,手动操作需要在熟悉集群的 API 使用的情况下,例如需要获取节点、索引、分片的信息,不然的话不知道参数怎么填写、分片怎么迁移。此时可以使用 Head、kopf、Cerebro 等可视化工具进行查看,比较适合运维人员,而且,分片的迁移指挥工作也可以交给这些工具,只要通过鼠标点击就可以完成分片的迁移,很方便。
验证
检验查询语句的合法性,不仅仅是满足 JSON 格式那么简单:
1 | POST /my-index-post/_validate/query?explain |
检查分片分配的相关信息:
1 | 不带任何参数执行该命令,会输出当前所有未分配分片的失败原因 |

