快速开始

使用版本:V7.12
资料来自官方文档

本指南幫助初學者學習如何:

將數據添加到 Elasticsearch
搜索和排序數據
在搜索過程中從非結構化內容中提取字段

测试运行:

http://localhost:9200
响应:

{"name": "DESKTOP-2A43T46","cluster_name": "elasticsearch","cluster_uuid": "z8ox4lqeTPWbcJs1gZNlyw","version": {"number": "7.12.0","build_flavor": "default","build_type": "zip","build_hash": "78722783c38caa25a70982b5b042074cde5d3b3a","build_date": "2021-03-18T06:17:15.410153305Z","build_snapshot": false,"lucene_version": "8.8.0","minimum_wire_compatibility_version": "6.8.0","minimum_index_compatibility_version": "6.0.0-beta1"},"tagline": "You Know, for Search"}

添加數據

您可以將數據作為稱為文檔的 JSON 對象添加到 Elasticsearch。 Elasticsearch 將這些文檔存儲在可搜索索引中。

對於時間序列數據(例如日誌和指標),您通常將文檔添加到由多個自動生成的支持索引組成的數據流中。

數據流需要與其名稱相匹配的索引模板。 Elasticsearch 使用此模板來配置流的支持索引。 發送到數據流的文檔必須具有 @timestamp 字段。

添加單個文檔

提交以下索引請求以將單個日誌條目添加到logs-my_app-default數據流中。 由於logs-my_app-default不存在,請求會使用內置的logs-*-*索引模板自動創建它。

POST logs-my_app-default/_doc{"@timestamp": "2099-05-06T16:21:15.000Z","event": {"original": "192.0.2.42 - - [06/May/2099:16:21:15 +0000] \"GET /images/bg.jpg HTTP/1.0\" 200 24736"}}

響應包括 Elasticsearch 為文檔生成的元數據:

包含文檔的支持 _index。 Elasticsearch 自動生成支持索引的名稱。
索引中文檔的唯一 _id。

{"_index": ".ds-logs-my_app-default-2099-05-06-000001","_type": "_doc","_id": "gl5MJXMBMk1dGnErnBW8","_version": 1,"result": "created","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 0,"_primary_term": 1}

添加多個文檔

使用 _bulk 接口在一個請求中添加多個文檔。 批量數據必須是換行符分隔的 JSON (NDJSON)。 每行必須以換行符 (\n) 結尾,包括最後一行。

PUT logs-my_app-default/_bulk{ "create": { } }{ "@timestamp": "2099-05-07T16:24:32.000Z", "event": { "original": "192.0.2.242 - - [07/May/2020:16:24:32 -0500] \"GET /images/hm_nbg.jpg HTTP/1.0\" 304 0" } }{ "create": { } }{ "@timestamp": "2099-05-08T16:25:42.000Z", "event": { "original": "192.0.2.255 - - [08/May/2099:16:25:42 +0000] \"GET /favicon.ico HTTP/1.0\" 200 3638" } }

查询数据

索引文檔可近乎實時地搜索。 以下搜索匹配logs-my_app-default中的所有日誌條目,並按 @timestamp降序對它們進行排序。

GET logs-my_app-default/_search{"query": {"match_all": { }},"sort": [{"@timestamp": "desc"}]}

默認情況下,響應的命中部分最多包含與搜索匹配的前 10 個文檔。 每個命中的 _source 包含索引期間提交的原始 JSON 對象。

{"took": 2,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 3,"relation": "eq"},"max_score": null,"hits": [{"_index": ".ds-logs-my_app-default-2099-05-06-000001","_type": "_doc","_id": "PdjWongB9KPnaVm2IyaL","_score": null,"_source": {"@timestamp": "2099-05-08T16:25:42.000Z","event": {"original": "192.0.2.255 - - [08/May/2099:16:25:42 +0000] \"GET /favicon.ico HTTP/1.0\" 200 3638"}},"sort": [4081940742000]},...]}}

指定获取特定字段

對於大型文檔來說,解析整個 _source 是很麻煩的。 要將其從響應中排除,請將 _source 參數設置為 false。 相反,請使用 fields 參數來檢索所需的字段。

GET logs-my_app-default/_search{"query": {"match_all": { }},"fields": ["@timestamp"],"_source": false,"sort": [{"@timestamp": "desc"}]}

響應包含每個命中的字段值作為平面數組。

{..."hits": {..."hits": [{"_index": ".ds-logs-my_app-default-2099-05-06-000001","_type": "_doc","_id": "PdjWongB9KPnaVm2IyaL","_score": null,"fields": {"@timestamp": ["2099-05-08T16:25:42.000Z"]},"sort": [4081940742000]},...]}}

搜索日期範圍

要搜索特定時間或 IP 範圍,請使用 range 查詢。

GET logs-my_app-default/_search{"query": {"range": {"@timestamp": {"gte": "2099-05-05","lt": "2099-05-08"}}},"fields": ["@timestamp"],"_source": false,"sort": [{"@timestamp": "desc"}]}

您可以使用日期数字來定義相對時間範圍。 以下查詢搜索過去一天的數據,該數據不會與logs-my_app-default 中的任何日誌條目匹配。

GET logs-my_app-default/_search{"query": {"range": {"@timestamp": {"gte": "now-1d/d","lt": "now/d"}}},"fields": ["@timestamp"],"_source": false,"sort": [{"@timestamp": "desc"}]}

從非結構化內容中提取字段

您可以在搜索期間從非結構化內容(例如日誌消息)中提取運行時字段。

使用以下搜索從 event.original 中提取 source.ip 運行時字段。 要將其包含在響應中,請將 source.ip 添加到 fields 參數中。

GET logs-my_app-default/_search{"runtime_mappings": {"source.ip": {"type": "ip","script": """String sourceip=grok('%{IPORHOST:sourceip} .*').extract(doc[ "event.original" ].value)?.sourceip;if (sourceip != null) emit(sourceip);"""}},"query": {"range": {"@timestamp": {"gte": "2099-05-05","lt": "2099-05-08"}}},"fields": ["@timestamp","source.ip"],"_source": false,"sort": [{"@timestamp": "desc"}]}

合并查询

您可以使用 bool 查询来组合多个查询。 以下搜索结合了两种范围查询:一种针对 @timestamp,另一种针对 source.ip 运行时字段。

GET logs-my_app-default/_search{"runtime_mappings": {"source.ip": {"type": "ip","script": """String sourceip=grok('%{IPORHOST:sourceip} .*').extract(doc[ "event.original" ].value)?.sourceip;if (sourceip != null) emit(sourceip);"""}},"query": {"bool": {"filter": [{"range": {"@timestamp": {"gte": "2099-05-05","lt": "2099-05-08"}}},{"range": {"source.ip": {"gte": "192.0.2.0","lte": "192.0.2.240"}}}]}},"fields": ["@timestamp","source.ip"],"_source": false,"sort": [{"@timestamp": "desc"}]}

聚合数据

使用聚合将数据汇总为指标、统计数据或其他分析。

以下搜索使用聚合来使用 http.response.body.bytes 运行时字段来计算average_response_size。 聚合仅在与查询匹配的文档上运行。

GET logs-my_app-default/_search{"runtime_mappings": {"http.response.body.bytes": {"type": "long","script": """String bytes=grok('%{COMMONAPACHELOG}').extract(doc[ "event.original" ].value)?.bytes;if (bytes != null) emit(Integer.parseInt(bytes));"""}},"aggs": {"average_response_size":{"avg": {"field": "http.response.body.bytes"}}},"query": {"bool": {"filter": [{"range": {"@timestamp": {"gte": "2099-05-05","lt": "2099-05-08"}}}]}},"fields": ["@timestamp","http.response.body.bytes"],"_source": false,"sort": [{"@timestamp": "desc"}]}

响应的 aggregations 对象包含聚合结果。

{..."aggregations" : {"average_response_size" : {"value" : 12368.0}}}