快速开始

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

}

}

}

原文链接:

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。