5分钟上手ES的具体使用
相信有很多同学想要去学习elk时会使用docker等一些方式去下载相关程序,但提到真正去使用es的一系列操作时又会知之甚少。于是这一篇博客应运而生。
本文就以下载好elk/efk系统后应该如何去使用为例,介绍es的具体操作。
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"]
类似关系型数据库的对比
- Elasticsearch 索引 ≈ 数据库中的 数据库。
- Elasticsearch 文档 ≈ 数据库中的 行。
- Elasticsearch 字段 ≈ 数据库中的 列。
现在应该对es的基础结构有了大概的了解。
然后是如何去创建这些索引,文档,字段呢?
es封装好了很多的方法,可以直接使用api进行请求,非常方便。
常用的:
shell
创建一个名为 `my_index` 的索引
curl -X PUT "localhost:9200/my_index"
(X的意思是指定HTTP请求的方法)如GET,POST,PUT,DELETE等
以下为了展示更清晰,使用kibana中携带的开发工具去展示教程:
展示es集群状态:
GET _cluster/health
返回示例值:
json
{
"cluster_name": "elasticsearch",
"status": "green", // 集群状态,"green" 表示所有节点都正常
"number_of_nodes": 3
}
创建索引
先以最基础的create来了解es的结构
json
创建一个新的索引 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
类型的数据不会被分词,适合用于过滤、排序、聚合等操作。 - 应用场景:分类标签、用户 ID、国家代码等。
date
:
- 用途 :用于存储日期和时间类型的数据。Elasticsearch 可以对
date
字段进行范围查询、排序和聚合操作。 - 应用场景:发布日期、创建时间、更新时间等。
integer
:
- 用途:用于存储整型数据。适合需要存储整数类型的数据。
- 应用场景:年龄、订单编号、库存数量等。
float
、double
:
- 用途 :用于存储浮点数。
float
用于单精度浮点数,double
用于双精度浮点数。 - 应用场景:价格、评分、地理坐标等。
boolean
:
- 用途 :用于存储布尔值(
true
或false
)。 - 应用场景:激活状态、是否管理员、是否完成等。
nested
:
- 用途:用于存储嵌套对象。它允许存储结构化的对象数组,并且可以对每个对象中的字段进行独立查询。
- 应用场景:评论中的回复、订单中的商品列表等。
示例:
json
"comments": {
"type": "nested",
"properties": {
"user": { "type": "keyword" },
"comment": { "type": "text" },
"date": { "type": "date" }
}
}
object
:
-
用途 :用于存储 JSON 对象。与
nested
不同,object
字段无法对嵌套对象进行独立查询,但更适合存储简单的对象数据。 -
应用场景:用户地址、配置参数等。
示例:
json
"address": {
"type": "object",
"properties": {
"street": { "type": "text" },
"city": { "type": "keyword" }
}
}
geo_point
:
- 用途:用于存储地理坐标(经纬度)。可以进行地理位置相关的查询,如范围搜索和距离计算。
- 应用场景:地点、用户位置、商店位置等。
ip
:
- 用途:用于存储 IP 地址(IPv4 和 IPv6)。适合用于记录和查询网络请求相关的数据。
- 应用场景:用户访问日志、服务器 IP 地址等。
比较常用的总结来说的话:
text
类型适合需要进行全文搜索的字段,如博客内容、产品描述。
keyword
类型适合需要精确匹配、聚合或排序的字段,如用户名、产品 ID、标签。
date
类型适合需要进行时间范围查询的字段,如创建时间、修改时间。
integer
和float
类型适合需要进行数值计算或比较的字段,如产品价格、库存数量、评分。
nested
类型适合存储并查询复杂的嵌套数组数据,如订单中的商品列表或评论的回复。
常见命令
创建索引 :PUT
我们再回到常见命令的学习:重新看一下创建索引的命令:
json
PUT /my_index
{
"mappings": {
"properties": {
"title": {
"type": "text"
},
"published_date": {
"type": "date"
},
"author": {
"type": "keyword"
}
}
}
}
现在就知道为什么要选这几种类型了。
插入文档:POST
既然创建了索引,自然就要插入数据
json
POST /my_index/_doc/1
{
"title": "Elasticsearch Basics",
"published_date": "2024-01-01",
"author": "John Doe"
}
我们发现es的命令基本都是json格式的,在以后开发时也要注意。
_doc就表示文档的意思,1
:文档的 ID。
获取文档:GET
从指定索引中获取文档ID为1的文档:
GET /my_index/_doc/1
示例:
json
{
"_index": "my_index",
"_id": "1",
"_source": {
"title": "Elasticsearch Basics",
"published_date": "2024-01-01",
"author": "John Doe"
}
}
更新文档: _update
json
POST /my_index/_update/1
{
"doc": {
"title": "Advanced Elasticsearch"
}
}
(_update命令是局部更新,并不需要提供完整的文档)
删除文档:DELETE
删除ID为1的文档
DELETE /my_index/_doc/1
搜索文档:_search
json
GET /my_index/_search
{
"query": {
"match": {
"title": "Elasticsearch"
}
}
}
返回示例:
json
{
"hits": {
"total": {
"value": 1
},
"hits": [
{
"_source": {
"title": "Elasticsearch Basics",
"published_date": "2024-01-01",
"author": "John Doe"
}
}
]
}
}
搜索参数中:match为全文搜索查询,title
字段中包含 "Elasticsearch" 的文档将会被返回。
批量操作:_bulk
该方式很高效
插入示例:
json
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" }
==注意:==批量插入数据时,每个文档必须包含一行操作说明和一行数据。
聚合查询
统计索引中文档的作者数量:
json
GET /my_index/_search
{
"size": 0,
"aggs": {
"authors": {
"terms": {
"field": "author.keyword"
}
}
}
}
返回示例:
json
{
"aggregations": {
"authors": {
"buckets": [
{
"key": "John Doe",
"doc_count": 1
},
{
"key": "Jane Doe",
"doc_count": 1
}
]
}
}
}
注意:
aggregations
(聚合):用于对数据进行统计、分组、分析。terms
聚合:按字段值对文档进行分组。
本篇博客大致就这些内容,之后会讲解elk/efk系统对接主流系统的操作(.log,nginx,mysql等等)。欢迎关注。