相信有很多同学想要去学习elk时会使用docker等一些方式去下载相关程序,但提到真正去使用es的一系列操作时又会知之甚少。于是这一篇博客应运而生。
本文就以下载好elk/efk系统后应该如何去使用为例,介绍es的具体操作。
索引(Index):类似于关系型数据库中的“数据库”,是数据存储的容器。
文档(Document):类似于关系型数据库中的“行”,是 JSON 格式的数据单位。
字段(Field):类似于“列”,每个文档由多个字段组成。
举个例子:
{
"index": "library",
"document": {
"id": 1,
"title": "Elasticsearch Basics",
"author": "John Doe",
"published_date": "2024-01-01",
"pages": 300,
"categories": ["Technology", "Databases"]
}
}
说明:索引:library
是索引的名称。
文档:这条记录是一个书籍文档,文档 ID 为 1
。
字段:
title
(标题):“Elasticsearch Basics”author
(作者):“John Doe”published_date
(出版日期):“2024-01-01”pages
(页数):300categories
(类别):[“Technology”, “Databases”]现在应该对es的基础结构有了大概的了解。
然后是如何去创建这些索引,文档,字段呢?
es封装好了很多的方法,可以直接使用api进行请求,非常方便。
常用的:
创建一个名为 `my_index` 的索引
curl -X PUT "localhost:9200/my_index"
(X的意思是指定HTTP请求的方法)如GET,POST,PUT,DELETE等
以下为了展示更清晰,使用kibana中携带的开发工具去展示教程:
返回示例值:
{
"cluster_name": "elasticsearch",
"status": "green", // 集群状态,"green" 表示所有节点都正常
"number_of_nodes": 3
}
先以最基础的create来了解es的结构
创建一个新的索引 my_index,并定义它的字段。
title:Text类型 published_date:date类型,author:keyword类型。
PUT /my_index
{
"mappings": {
"properties": {
"title": {
"type": "text"
},
"published_date": {
"type": "date"
},
"author": {
"type": "keyword"
}
}
}
}
mappings
:映射是一个描述文档字段以及字段类型的定义。类似于关系型数据库中的“表结构”或“schema”,它告诉 Elasticsearch 每个字段是什么类型,应该如何处理和索引这些字段的数据。
properties
:是 mappings
的子级,它定义了文档中每个字段的名称和类型。每个字段的类型决定了 Elasticsearch 如何存储、索引和查询该字段的数据。
既然讲到创建,那就将es中常用的数据类型和应用场景说一下
text
:
text
类型的数据会被分析(分词),以便进行全文检索。keyword
:
keyword
类型的数据不会被分词,适合用于过滤、排序、聚合等操作。date
:
date
字段进行范围查询、排序和聚合操作。integer
:
float
、double
:
float
用于单精度浮点数,double
用于双精度浮点数。boolean
:
true
或 false
)。nested
:
示例:
"comments": {
"type": "nested",
"properties": {
"user": { "type": "keyword" },
"comment": { "type": "text" },
"date": { "type": "date" }
}
}
object
:
用途:用于存储 JSON 对象。与 nested
不同,object
字段无法对嵌套对象进行独立查询,但更适合存储简单的对象数据。
应用场景:用户地址、配置参数等。
示例:
"address": {
"type": "object",
"properties": {
"street": { "type": "text" },
"city": { "type": "keyword" }
}
}
geo_point
:
ip
:
比较常用的总结来说的话:
text
类型适合需要进行全文搜索的字段,如博客内容、产品描述。
keyword
类型适合需要精确匹配、聚合或排序的字段,如用户名、产品 ID、标签。
date
类型适合需要进行时间范围查询的字段,如创建时间、修改时间。
integer
和float
类型适合需要进行数值计算或比较的字段,如产品价格、库存数量、评分。
nested
类型适合存储并查询复杂的嵌套数组数据,如订单中的商品列表或评论的回复。
我们再回到常见命令的学习:重新看一下创建索引的命令:
PUT /my_index
{
"mappings": {
"properties": {
"title": {
"type": "text"
},
"published_date": {
"type": "date"
},
"author": {
"type": "keyword"
}
}
}
}
现在就知道为什么要选这几种类型了。
既然创建了索引,自然就要插入数据
POST /my_index/_doc/1
{
"title": "Elasticsearch Basics",
"published_date": "2024-01-01",
"author": "John Doe"
}
我们发现es的命令基本都是json格式的,在以后开发时也要注意。
_doc就表示文档的意思,1
:文档的 ID。
从指定索引中获取文档ID为1的文档:
GET /my_index/_doc/1
示例:
{
"_index": "my_index",
"_id": "1",
"_source": {
"title": "Elasticsearch Basics",
"published_date": "2024-01-01",
"author": "John Doe"
}
}
POST /my_index/_update/1
{
"doc": {
"title": "Advanced Elasticsearch"
}
}
(_update命令是局部更新,并不需要提供完整的文档)
删除ID为1的文档
DELETE /my_index/_doc/1
GET /my_index/_search
{
"query": {
"match": {
"title": "Elasticsearch"
}
}
}
返回示例:
{
"hits": {
"total": {
"value": 1
},
"hits": [
{
"_source": {
"title": "Elasticsearch Basics",
"published_date": "2024-01-01",
"author": "John Doe"
}
}
]
}
}
搜索参数中:match为全文搜索查询,title
字段中包含 “Elasticsearch” 的文档将会被返回。
该方式很高效
插入示例:
POST /_bulk
{ "index": { "_index": "my_index", "_id": "2" }}
{ "title": "Learning Elasticsearch", "published_date": "2023-01-01", "author": "Jane Doe" }
{ "index": { "_index": "my_index", "_id": "3" }}
{ "title": "Mastering Elasticsearch", "published_date": "2022-01-01", "author": "Jake Doe" }
==注意:==批量插入数据时,每个文档必须包含一行操作说明和一行数据。
统计索引中文档的作者数量:
GET /my_index/_search
{
"size": 0,
"aggs": {
"authors": {
"terms": {
"field": "author.keyword"
}
}
}
}
返回示例:
{
"aggregations": {
"authors": {
"buckets": [
{
"key": "John Doe",
"doc_count": 1
},
{
"key": "Jane Doe",
"doc_count": 1
}
]
}
}
}
注意:
aggregations
(聚合):用于对数据进行统计、分组、分析。terms
聚合:按字段值对文档进行分组。本篇博客大致就这些内容,之后会讲解elk/efk系统对接主流系统的操作(.log,nginx,mysql等等)。欢迎关注。