使用版本: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
}
}
}