Elasticsearch 快速入门

最近开始学习 Elasticsearch 参考文档 Quick start 写作了本文。

运行 Elasticsearch

  1. 安装 Elastic search
docker network create elastic
docker run -d --name es01 --network elastic -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.13.4
  1. 安装 Kibana
docker run -d --name kib01 --network elastic -p 5601:5601 -e "ELASTICSEARCH_HOSTS=http://es01:9200" kibana:7.13.4
  1. 访问 Kibana http://localhost:5601

发送请求到 Elasticsearch

  1. 使用终端执行curl命令
curl -X GET http://localhost:9200
  1. 使用 Kibana

Elasticsearch 快速入门

添加数据

添加单数据

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 中容易混淆的概念的简单解释。

  • logs-my_app-default 索引(名词):类似关系数据库中的一个 数据库
  • _doc 类型名称,从 es6 之后一个索引只支持一个类型,默认的类型名称就叫 _doc
  • 索引(动词):索引一个文档 就是存储一个文档到一个索引(名词)中以便被检索和查询。
  • 倒排索引:倒排索引 和关系数据库中为表字段创建一个 索引(B-tree索引) 类似,用来提升查询效率。

批量添加数据

批量添加数据需要使用到 _bluk 端点,批量数据每行必须以换行符(\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" } }

检索数据

  1. 查询所有数据,并使用 @timestamp 字端排序
GET logs-my_app-default/_search
{
  "query": {
    "match_all": { }
  },
  "sort": [
    {
      "@timestamp": "desc"
    }
  ]
}
  1. 通过对_source的控制可以精准查询指定字段
...
"fields": [
	"@timestamp"
],
"_source": false,
...
  1. 也可以通过范围查找
...
"query": {
  "range": {
    "@timestamp": {
      "gte": "2099-05-05",
      "lt": "2099-05-08"
    }
  }
},
...
  1. 提取运行时字段
  ...
  "runtime_mappings": {
    "source.ip": {
      "type": "ip",
      "script": """
        String sourceip=grok(‘%{IPORHOST:sourceip} .*‘).extract(doc[ "event.original" ].value)?.sourceip;
        if (sourceip != null) emit(sourceip);
      """
    }
  },
  "fields": [
    "@timestamp",
    "source.ip"
  ],
  ...
  1. 使用 bool 来完成组合查询
...
  "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"
            }
          }
        }
      ]
    }
  },
...
  1. 使用 aggs 来完成聚合查询
...
  "aggs": {
    "average_response_size":{
      "avg": {
        "field": "http.response.body.bytes"
      }
    }
  },
  "fields": [
    "@timestamp",
    "http.response.body.bytes"
  ],
...

清理测试数据

DELETE _data_stream/logs-my_app-default

Elasticsearch 快速入门

上一篇:yum本地源仓库安装报错 被锁定如何解决?


下一篇:win32系统信息获取