5分钟熟练上手ES的具体使用

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(页数):300
  • categories(类别):[“Technology”, “Databases”]
类似关系型数据库的对比
  • Elasticsearch 索引 ≈ 数据库中的 数据库
  • Elasticsearch 文档 ≈ 数据库中的
  • Elasticsearch 字段 ≈ 数据库中的

现在应该对es的基础结构有了大概的了解。

然后是如何去创建这些索引,文档,字段呢?

es封装好了很多的方法,可以直接使用api进行请求,非常方便。

常用的:

创建一个名为 `my_index` 的索引
curl -X  PUT  "localhost:9200/my_index"

(X的意思是指定HTTP请求的方法)如GET,POST,PUT,DELETE等

以下为了展示更清晰,使用kibana中携带的开发工具去展示教程:

展示es集群状态:
GET _cluster/health

返回示例值:

{
  "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 类型的数据不会被分词,适合用于过滤、排序、聚合等操作。
  • 应用场景:分类标签、用户 ID、国家代码等。

date

  • 用途:用于存储日期和时间类型的数据。Elasticsearch 可以对 date 字段进行范围查询、排序和聚合操作。
  • 应用场景:发布日期、创建时间、更新时间等。

integer

  • 用途:用于存储整型数据。适合需要存储整数类型的数据。
  • 应用场景:年龄、订单编号、库存数量等。

floatdouble

  • 用途:用于存储浮点数。float 用于单精度浮点数,double 用于双精度浮点数。
  • 应用场景:价格、评分、地理坐标等。

boolean

  • 用途:用于存储布尔值(truefalse)。
  • 应用场景:激活状态、是否管理员、是否完成等。

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

  • 用途:用于存储 IP 地址(IPv4 和 IPv6)。适合用于记录和查询网络请求相关的数据。
  • 应用场景:用户访问日志、服务器 IP 地址等。

比较常用的总结来说的话:

text 类型适合需要进行全文搜索的字段,如博客内容、产品描述。

keyword 类型适合需要精确匹配、聚合或排序的字段,如用户名、产品 ID、标签。

date 类型适合需要进行时间范围查询的字段,如创建时间、修改时间。

integerfloat 类型适合需要进行数值计算或比较的字段,如产品价格、库存数量、评分。

nested 类型适合存储并查询复杂的嵌套数组数据,如订单中的商品列表或评论的回复。

常见命令

创建索引 :PUT

我们再回到常见命令的学习:重新看一下创建索引的命令:

PUT /my_index
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "published_date": {
        "type": "date"
      },
      "author": {
        "type": "keyword"
      }
    }
  }
}

现在就知道为什么要选这几种类型了。

插入文档:POST

既然创建了索引,自然就要插入数据

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

示例:

{
  "_index": "my_index",
  "_id": "1",
  "_source": {
    "title": "Elasticsearch Basics",
    "published_date": "2024-01-01",
    "author": "John Doe"
  }
}
更新文档: _update
POST /my_index/_update/1
{
  "doc": {
    "title": "Advanced Elasticsearch"
  }
}

(_update命令是局部更新,并不需要提供完整的文档)

删除文档:DELETE

删除ID为1的文档

DELETE /my_index/_doc/1
搜索文档:_search
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” 的文档将会被返回。

批量操作:_bulk

该方式很高效

插入示例:

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等等)。欢迎关注。

你可能感兴趣的:(elasticsearch,jenkins,大数据,学习)