环境信息
集群状态 查看集群健康状态 Elasticsearch 的集群监控信息中包含了许多的统计数据,其中最为重要的一项就是 集群健康 , 它在 status
字段中展示为 green
、 yellow
或者 red
。
green
- 所有的主分片和副分片都正常运行
yellow
- 所有主分片都正常运行,但不是所有的副本分片都正常运行
red
- 有主分片没能正常运行
分片
概念说明
$ curl 'http://localhost:9200/_cluster/health' {"cluster_name":"elasticsearch","status":"green","timed_out":false,"number_of_nodes":1,"number_of_data_nodes":1,"active_primary_shards":1,"active_shards":1,"relocating_shards":0,"initializing_shards":0,"unassigned_shards":0,"delayed_unassigned_shards":0,"number_of_pending_tasks":0,"number_of_in_flight_fetch":0,"task_max_waiting_in_queue_millis":0,"active_shards_percent_as_number":100.0} $ curl 'http://localhost:9200/_cluster/health?pretty' { "cluster_name" : "elasticsearch", "status" : "green", "timed_out" : false, "number_of_nodes" : 1, "number_of_data_nodes" : 1, "active_primary_shards" : 1, "active_shards" : 1, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 0, "delayed_unassigned_shards" : 0, "number_of_pending_tasks" : 0, "number_of_in_flight_fetch" : 0, "task_max_waiting_in_queue_millis" : 0, "active_shards_percent_as_number" : 100.0 }
查看集群节点信息 使用 _cat/nodes
API 可以获取集群中所有节点的信息,包括它们的 IP 地址、堆内存使用情况、CPU 使用情况等。
# curl -u elastic:XhScf5Jqw -XGET 'http://172.31.25.229:9200/_cat/nodes?pretty' 172.31.25.229 58 98 9 1.86 2.27 2.36 dilm - node-1 172.31.30.249 54 98 10 2.05 2.12 2.30 dilm - node-2 172.31.21.225 65 91 0 0.00 0.04 0.05 dfilmrt * node-3 # curl -u elastic:XhScf5Jqw -XGET 'http://172.31.25.229:9200/_cat/nodes?v' ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name 172.31.25.229 51 99 10 2.11 2.33 2.37 dilm - node-1 172.31.30.249 49 99 9 1.96 2.06 2.25 dilm - node-2 172.31.21.225 40 91 0 0.03 0.04 0.05 dfilmrt * node-3
输出信息说明
heap.percent
- JVM 堆内存使用的百分比。这是节点分配给 Java 虚拟机堆的内存使用量的百分比。
ram.percent
- 节点的物理内存(RAM)使用率的百分比
cpu
- 节点的CPU使用率百分比
node.role
- 节点的角色。各个字母含义如下
d
- 代表数据节点 Data Node。负责存储数据,执行与数据相关的操作,如 CRUD(创建、读取、更新、删除)、搜索和聚合。
i
- 代表摄取节点 Ingest Node。用于预处理文档,然后再将其索引到 Elasticsearch 中,它们可以运行摄取管道,这些管道可以执行各种转换,如提取数据、转换数据格式、添加信息等。
l
- 代表机器学习节点 Machine Learning Node。机器学习节点专门用于运行Elasticsearch的机器学习功能,它们可以分析数据,识别模式,执行异常检测等。
m
- 代表主节点 Master Node。主节点负责管理集群的全局状态,例如哪些索引存在,哪个节点是哪个索引的一部分等,它们还负责集群重新分片、索引创建、删除等操作。
r
- 代表远程集群客户端节点 Remote Cluster Client Node。这些节点用于连接到远程集群,它们使得可以从一个集群中执行跨集群搜索和其他操作
t
- 代表转换节点 Transform Node。转换节点用于运行 Elasticsearch 中的转换任务,这些任务可以将现有的 Elasticsearch 索引数据重新整理和汇总成新的索引。
*
- 表示这个节点是当前的主节点。
使用 _nodes/stats
查看集群中所有节点的详细状态和统计信息
# curl -u elastic:XhScf5JqwVsSQwHe -XGET 'http://172.31.25.229:9200/_nodes/stats?pretty' { "_nodes" : { "total" : 3, "successful" : 3, "failed" : 0 }, "cluster_name" : "es-cluster", "nodes" : { "TrQqg_8HTDiKBt6t8Z1JVw" : { "timestamp" : 1699941330544, "name" : "node-1", "transport_address" : "172.31.25.229:9300", "host" : "172.31.25.229", "ip" : "172.31.25.229:9300", "roles" : [ "ingest", "master", "data", "ml" ], "attributes" : { "ml.machine_memory" : "133483876352", "xpack.installed" : "true", "ml.max_open_jobs" : "20" }, "indices" : { "docs" : { "count" : 1725702315, "deleted" : 0 }, "store" : { "size_in_bytes" : 1766657662877 }, "indexing" : { "index_total" : 28053218, "index_time_in_millis" : 6610781, "index_current" : 1, "index_failed" : 0, "delete_total" : 0, "delete_time_in_millis" : 0, "delete_current" : 0, "noop_update_total" : 0, "is_throttled" : false, "throttle_time_in_millis" : 0 }, ...
参考以下命令查看指定节点的详细状态和统计信息,Endpoint 格式参考 _nodes/{nodeId}/stats?pretty
# curl -u elastic:XhScf5JqwVsSQwHe -XGET 'http://172.31.25.229:9200/_nodes/TrQqg_8HTDiKBt6t8Z1JVw/stats?pretty' { "_nodes" : { "total" : 1, "successful" : 1, "failed" : 0 }, "cluster_name" : "es-cluster", "nodes" : { "TrQqg_8HTDiKBt6t8Z1JVw" : { "timestamp" : 1699941591263, "name" : "node-1", "transport_address" : "172.31.25.229:9300", "host" : "172.31.25.229", "ip" : "172.31.25.229:9300", "roles" : [ "ingest", "master", "data", "ml" ], "attributes" : { "ml.machine_memory" : "133483876352", "xpack.installed" : "true", "ml.max_open_jobs" : "20" }, "indices" : { "docs" : { "count" : 1726608289, "deleted" : 0 }, "store" : { "size_in_bytes" : 1768415039992 }, "indexing" : { "index_total" : 29016441, "index_time_in_millis" : 6829570, "index_current" : 0, "index_failed" : 0, "delete_total" : 0, "delete_time_in_millis" : 0, "delete_current" : 0, "noop_update_total" : 0, "is_throttled" : false, "throttle_time_in_millis" : 0 },
获取集群级别的信息和统计数据 /?pretty
参数的主要作用为通过添加缩进和换行增强输出的可读性
$ curl 'http://localhost:9200/?pretty' { "name" : "b5f96e32c638", "cluster_name" : "elasticsearch", "cluster_uuid" : "UAiC0qVVT-Ov4nJFvoE1HA", "version" : { "number" : "8.8.2", "build_flavor" : "default", "build_type" : "tar", "build_hash" : "98e1271edf932a480e4262a471281f1ee295ce6b", "build_date" : "2023-06-26T05:16:16.196344851Z", "build_snapshot" : false, "lucene_version" : "9.6.0", "minimum_wire_compatibility_version" : "7.17.0", "minimum_index_compatibility_version" : "7.0.0" }, "tagline" : "You Know, for Search" }
索引及文档管理 创建或者添加索引 索引概念说明 。索引(index
) 在 Elasticsearch 中有多个含义 [3]
索引(名词)
:
一个 索引(index
) 类似于传统关系数据库中的一个 数据库 ,是一个存储关系型文档的地方。 索引 (index)
的复数词为 indices
或 indexes
。
索引(动词)
:
索引一个文档 就是存储一个文档到一个 索引 (名词)
中以便被检索和查询。这非常类似于 SQL 语句中的 INSERT
关键词,除了文档已存在时,新文档会替换旧文档情况之外。
倒排索引
:
关系型数据库通过增加一个 索引 比如一个 B树(B-tree)索引
到指定的列上,以便提升数据检索速度。Elasticsearch 和 Lucene 使用了一个叫做 倒排索引 的结构来达到相同的目的。
使用以下 url 可以添加名为 blogs
的索引。在索引建立的时候就已经确定了主分片数 ,但是副分片数可以随时修改。索引在默认情况下会被分配 5 个主分片 。以下示例演示了创建 3 个主分片和一份副本(每个主分片拥有一个副本)的 index
PUT /blogs { "settings" : { "number_of_shards" : 3, "number_of_replicas" : 1 } }
curl
命令操作如下
$ curl -X PUT 'localhost:9200/blogs' -H "Content-Type: application/json" -d '{"settings": {"number_of_shards": 3, "number_of_replicas": 1}}' {"acknowledged":true,"shards_acknowledged":true,"index":"blogs"}
重新查看集群 健康状态
$ curl 'localhost:9200/_cluster/health/?pretty' { "cluster_name" : "elasticsearch", "status" : "yellow", "timed_out" : false, "number_of_nodes" : 1, "number_of_data_nodes" : 1, "active_primary_shards" : 4, "active_shards" : 4, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 3, "delayed_unassigned_shards" : 0, "number_of_pending_tasks" : 0, "number_of_in_flight_fetch" : 0, "task_max_waiting_in_queue_millis" : 0, "active_shards_percent_as_number" : 57.14285714285714 }
集群状态为 yellow
。表示所有主分片 都正常运行,但是 副本分片 没有全部处于正常状态。本示例中使用的单节点集群,因此所有副本都处于 unassigned_shards
状态。
调整分片的副本数量 在运行中的集群上是可以动态调整副本分片数目的,我们可以按需伸缩集群
PUT /blogs/_settings { "number_of_replicas" : 2 }
查看集群中所有的索引 # curl -u elastic:password1 -XGET "http://localhost:9200/_cat/indices?pretty" green open .fleet-file-data-endpoint-000001 HvLnz66ATPu3y-V7_LWiGw 1 1 0 0 494b 247b green open .internal.alerts-observability.logs.alerts-default-000001 qLVSX-3jTNSEJ5TUei8xeg 1 1 0 0 494b 247b green open .internal.alerts-observability.metrics.alerts-default-000001 No3BDeiPSS-Fc9VLC1_Bmw 1 1 0 0 494b 247b green open .fleet-file-data-agent-000001 8bD6W2sVROuRew13axuZtA 1 1 0 0 494b 247b green open metrics-endpoint.metadata_current_default BGeiP6xhT2ChBVlgGBDrGQ 1 1 0 0 494b 247b green open .internal.alerts-observability.slo.alerts-default-000001 8mwwuFYZRoKhEwnZgP-fAg 1 1 0 0 494b 247b green open .fleet-files-agent-000001 IPWzmYjyTCicpe92zEXVwg 1 1 0 0 494b 247b green open .ds-filebeat-8.8.2-2023.07.28-000001 U3A3AD3-R2KjiYXJaApgRQ 1 1 100 0 62.2kb 31.1kb green open .fleet-files-endpoint-000001 NTH-qwe1R6aPNLZKoHu8Yg 1 1 0 0 494b 247b green open .internal.alerts-security.alerts-default-000001 FnDUGt2SQN2qd4aztKtYXQ 1 1 0 0 494b 247b green open .internal.alerts-observability.apm.alerts-default-000001 l-nS3wQtQ3KptM4b93mosA 1 1 0 0 494b 247b green open .internal.alerts-observability.uptime.alerts-default-000001 VD8sDy64TZSWW2ArhdrSjQ 1 1 0 0 494b 247b
索引文档 我们可以提供自定义的 _id
值,或者让 index
API 自动生成。 [4]
使用自定义 ID 索引文档 PUT /{index}/{type}/{id} { "field": "value", ... }
举个例子,如果我们的索引称为 website ,类型称为 blog ,并且选择 123 作为 ID ,那么索引请求应该是下面这样:
$ curl -X PUT 'localhost:9200/website/_doc/123?pretty' -H 'Content-Type: application/json' -d '{ "title": "My first blog entry", "text": "Just trying this out...", "date": "2014/01/01" }'
Elasticsearch 响应体如下所示:
{ "_index" : "website", "_id" : "123", "_version" : 2, "result" : "updated", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 1, "_primary_term" : 1 }
新版本中已经没有了 {type}
概念,已经废弃,可以使用 _doc
代替。否则报错
$ curl -X PUT 'localhost:9200/website/blog/123' -H 'Content-Type: application/json' -d '{ "title": "My first blog entry", "text": "Just trying this out...", "date": "2014/01/01" }' {"error":"no handler found for uri [/website/blog/123] and method [PUT]"}
Elasticsearch 自动生成 ID 如果你的数据没有自然的 ID, Elasticsearch 可以帮我们自动生成 ID 。 请求的结构调整为: 不再使用 PUT
(用这个 URL 存储这个文档
), 而是使用 POST
(存储文档在这个 URL 命名空间下
)。
$ curl -X POST 'localhost:9200/website/_doc/?pretty' -H 'Content-Type: application/json' -d '{ "title": "My first blog entry", "text": "Just trying this out...", "date": "2014/01/01" }'
除了 _id
是 Elasticsearch 自动生成的,响应的其他部分和 使用自定义 ID 索引文档 的类似:
{ "_index" : "website", "_id" : "E6bZZ4kB3MyoSII6u2fy", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 2, "_primary_term" : 1 }
取回一个文档 为了从 Elasticsearch 中检索出文档,我们仍然使用相同的 _index
, _type
, 和 _id
,但是 HTTP 方法更改为 GET
[5]
$ curl 'localhost:9200/website/_doc/123?pretty' { "_index" : "website", "_id" : "123", "_version" : 2, "_seq_no" : 1, "_primary_term" : 1, "found" : true, "_source" : { "title" : "My first blog entry", "text" : "Just trying this out...", "date" : "2014/01/01" } }
响应体中 found
字段为 true
表示文档已经被找到, 如果我们请求一个不存在的文档,我们仍旧会得到一个 JSON 响应体,但是 found
将会是 false
。 此外, HTTP 响应码将会是 404 Not Found
,而不是 200 OK
默认情况下,Elasticsearch 将会返回整个 Document (文档)
,也可以不获取整个 Document (文档)
而只是获取其中的一部分内容,要实现此功能,可以使用查询参数 _source=title,text
$ curl 'localhost:9200/website/_doc/123?pretty&_source=title,text' { "_index" : "website", "_id" : "123", "_version" : 2, "_seq_no" : 1, "_primary_term" : 1, "found" : true, "_source" : { "title" : "My first blog entry", "text" : "Just trying this out..." } }
或者,如果你只想得到 _source 字段,不需要任何元数据,你能使用 _source 端点:
$ GET /website/blog/123/_source { "title": "My first blog entry", "text": "Just trying this out...", "date": "2014/01/01" }
此方法新版本(elasticsearch 8.8.2)不存在
$ curl 'localhost:9200/website/_doc/123/_source' {"error":"no handler found for uri [/website/_doc/123/_source] and method [GET]"}
获取 Elasticsearch 中所有的文档 获取 Elasticsearch 中所有的 文档(document
),使用以下 _search
查询
$ curl 'localhost:9200/_search?pretty' { "took" : 2, "timed_out" : false, "_shards" : { "total" : 4, "successful" : 4, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 4, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "website", "_id" : "123", "_score" : 1.0, "_source" : { "title" : "My first blog entry", "text" : "Just trying this out...", "date" : "2014/01/01" } }, { "_index" : "website", "_id" : "E6bZZ4kB3MyoSII6u2fy", "_score" : 1.0, "_source" : { "title" : "My first blog entry", "text" : "Just trying this out...", "date" : "2014/01/01" } }, { "_index" : "website", "_id" : "1", "_score" : 1.0, "_source" : { } }, { "_index" : "blogs", "_id" : "1", "_score" : 1.0, "_source" : { "title" : "test post", "content" : "test post" } } ] } }
输出结果中
hits
- 包含查询到的所有文档信息
hits.total
- 表示匹配到的文档总数
hits.hits
- 数组,包含了查询结果中的前 10 个文档。每个数组包含了 Document (文档)
的 _index
、_id
、_source
字段。
hits.hits[*]._score
- 每个数组包含了一个 _score
值,它衡量了文档和查询的匹配程度。默认情况下,首先返回最相关的文档,就是说,返回结果是按照 _score
降序排列的。
took
- 表示整个搜索请求耗费了多少 ms
_shards
- 这部分记录了此次查询中参与的分片的总数,以及这些分片成功了多少,失败了多少。
timed_out
- 表示查询是否超时,默认情况下,搜索请求不会超时。如果低响应时间更重要 ,可以使用 /_search?timeout=10ms
方式指定搜索的超时时间。
获取指定索引下的所有文档 要获取指定索引(index
) 下的所有文档(document
),使用 _search
方法
$ curl 'localhost:9200/website/_search?pretty' { "took" : 1, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 3, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "website", "_id" : "123", "_score" : 1.0, "_source" : { "title" : "My first blog entry", "text" : "Just trying this out...", "date" : "2014/01/01" } }, { "_index" : "website", "_id" : "E6bZZ4kB3MyoSII6u2fy", "_score" : 1.0, "_source" : { "title" : "My first blog entry", "text" : "Just trying this out...", "date" : "2014/01/01" } }, { "_index" : "website", "_id" : "1", "_score" : 1.0, "_source" : { } } ] } }
获取多个指定索引下的所有文档 有时候不想列出 Elasticsearch 中的所有文档,又需要一次性列出多个索引(index
) 中的 Document (文档)
。此时可以使用 Elasticsearch 的 多索引搜索 功能 [6]
$ curl 'localhost:9200/website,blogs/_search?pretty' { "took" : 2, "timed_out" : false, "_shards" : { "total" : 4, "successful" : 4, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 4, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "website", "_id" : "123", "_score" : 1.0, "_source" : { "title" : "My first blog entry", "text" : "Just trying this out...", "date" : "2014/01/01" } }, { "_index" : "website", "_id" : "E6bZZ4kB3MyoSII6u2fy", "_score" : 1.0, "_source" : { "title" : "My first blog entry", "text" : "Just trying this out...", "date" : "2014/01/01" } }, { "_index" : "website", "_id" : "1", "_score" : 1.0, "_source" : { } }, { "_index" : "blogs", "_id" : "1", "_score" : 1.0, "_source" : { "title" : "test post", "content" : "test post" } } ] } }
相关 API 格式汇总 [6]
/_search
在所有的索引中搜索所有的文档
/gb/_search
在 gb
索引中搜索所有的文档
/gb,us/_search
在 gb
和 us
索引中搜索所有的文档
/g*,u*/_search
在任何以 g
或者 u
开头的索引中搜索所有的文档
/_all/_search
在所有的索引中搜索
分页搜索结果 搜索默认返回最前面的 10 个结果,如果要自定义返回的结果数,可以使用以下查询参数 [7]
size
- 显示返回结果的数量,默认为 10
from
- 显示应该跳过的初始结果数量,默认为 0
如果每页展示 5 条结果,可以用下面的方式请求得到 1 到 3 页的数据
GET /_search?size=5 GET /_search?size=5&from=5 GET /_search?size=5&from=10
检查文档是否存在 如果只想知道一个 Document (文档)
是否存在,而不关心其内容,那么用 HEAD
方法代替 GET
方法,HEAD
方法只返回头部,不返回 HTTP body 内容
如果 Document (文档)
存在,返回 200 OK
,不存在则返回 404 Not Found
$ $ curl -v -X HEAD 'localhost:9200/blogs/_doc/1' * About to connect() to localhost port 9200 (#0) * Trying 127.0.0.1... * Connected to localhost (127.0.0.1) port 9200 (#0) > HEAD /blogs/_doc/1 HTTP/1.1 > User-Agent: curl/7.29.0 > Host: localhost:9200 > Accept: */* > < HTTP/1.1 200 OK < X-elastic-product: Elasticsearch < content-type: application/json < content-length: 147 < $ curl -v -X HEAD 'localhost:9200/blogs/_doc/11' * About to connect() to localhost port 9200 (#0) * Trying 127.0.0.1... * Connected to localhost (127.0.0.1) port 9200 (#0) > HEAD /blogs/_doc/11 HTTP/1.1 > User-Agent: curl/7.29.0 > Host: localhost:9200 > Accept: */* > < HTTP/1.1 404 Not Found < X-elastic-product: Elasticsearch < content-type: application/json < content-length: 43
获取文档中指定的字段 如果只想获取文档中指定的字段,而不是所有字段,可以使用 _source_includes
查询参数
# GET /log-8.8.2-2023.08.02/_search?size=10000&_source_includes=dissect.hostname,agent.name { "took": 178, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 10000, "relation": "gte" }, "max_score": 1, "hits": [ { "_index": "fm-k8s-pro-system-message-log-8.8.2-2023.08.02", "_id": "5IHStIkBQ8H_mBHnz6Ec", "_score": 1, "_source": { "agent": { "name": "fm-k8s-c1-worker2" }, "dissect": { "hostname": "ip-172-31-22-159" } } }, ] } }
data stream data stream
(数据流) 是 Elasticsearch 中用于管理时间序列数据的功能,它会自动创建和管理多个索引,包括索引写入和滚动索引 。data stream
(数据流) 有一个或者多个写入索引,用于实际写入和索引数据。由于数据流是一种时间序列的数据存储方式,不应该直接删除写入索引 。如果想要删除一个数据流,应该通过删除整个数据流来实现,而不是单独的删除写入索引
删除 data stream 要删除一个 data stream
(数据流),参考以下 API
$ curl -XDELETE localhost :9200 /_data_stream/logs-generic-default {"acknowledged" :true }
查看所有的 data stream $ curl localhost:9200/_data_stream?pretty { "data_streams" : [ { "name" : "logs-generic-default", "timestamp_field" : { "name" : "@timestamp" }, "indices" : [ { "index_name" : ".ds-logs-generic-default-2023.07.24-000001", "index_uuid" : "wxd_EjasSayBSu1d9GmcvA" } ], "generation" : 1, "_meta" : { "description" : "default logs template installed by x-pack", "managed" : true }, "status" : "GREEN", "template" : "logs", "ilm_policy" : "logs", "hidden" : false, "system" : false, "allow_custom_routing" : false, "replicated" : false } ] }
user and role 查看 Elasticsearch 中所有的用户 # curl -u elastic:password1 -XGET "http://localhost:9200/_security/user?pretty" { "elastic" : { "username" : "elastic", "roles" : [ "superuser" ], "full_name" : null, "email" : null, "metadata" : { "_reserved" : true }, "enabled" : true }, "kibana" : { "username" : "kibana", "roles" : [ "kibana_system" ], "full_name" : null, "email" : null, "metadata" : { "_deprecated_reason" : "Please use the [kibana_system] user instead.", "_deprecated" : true, "_reserved" : true }, "enabled" : true }, "kibana_system" : { "username" : "kibana_system", "roles" : [ "kibana_system" ], "full_name" : null, "email" : null, "metadata" : { "_reserved" : true }, "enabled" : true }, "logstash_system" : { "username" : "logstash_system", "roles" : [ "logstash_system" ], "full_name" : null, "email" : null, "metadata" : { "_reserved" : true }, "enabled" : true }, "beats_system" : { "username" : "beats_system", "roles" : [ "beats_system" ], "full_name" : null, "email" : null, "metadata" : { "_reserved" : true }, "enabled" : true }, "apm_system" : { "username" : "apm_system", "roles" : [ "apm_system" ], "full_name" : null, "email" : null, "metadata" : { "_reserved" : true }, "enabled" : true }, "remote_monitoring_user" : { "username" : "remote_monitoring_user", "roles" : [ "remote_monitoring_collector", "remote_monitoring_agent" ], "full_name" : null, "email" : null, "metadata" : { "_reserved" : true }, "enabled" : true } }
重置用户密码 具体步骤参考
参考链接 elastic 官网介绍
脚注