最近开始学习 Elasticsearch
参考文档 Quick start 写作了本文。
运行 Elasticsearch
- 安装 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
- 安装 Kibana
docker run -d --name kib01 --network elastic -p 5601:5601 -e "ELASTICSEARCH_HOSTS=http://es01:9200" kibana:7.13.4
- 访问 Kibana http://localhost:5601
发送请求到 Elasticsearch
- 使用终端执行
curl
命令
curl -X GET http://localhost:9200
- 使用 Kibana
添加数据
添加单数据
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" } }
检索数据
- 查询所有数据,并使用
@timestamp
字端排序
GET logs-my_app-default/_search
{
"query": {
"match_all": { }
},
"sort": [
{
"@timestamp": "desc"
}
]
}
- 通过对
_source
的控制可以精准查询指定字段
...
"fields": [
"@timestamp"
],
"_source": false,
...
- 也可以通过范围查找
...
"query": {
"range": {
"@timestamp": {
"gte": "2099-05-05",
"lt": "2099-05-08"
}
}
},
...
- 提取运行时字段
...
"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"
],
...
- 使用
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"
}
}
}
]
}
},
...
- 使用
aggs
来完成聚合查询
...
"aggs": {
"average_response_size":{
"avg": {
"field": "http.response.body.bytes"
}
}
},
"fields": [
"@timestamp",
"http.response.body.bytes"
],
...
清理测试数据
DELETE _data_stream/logs-my_app-default