概念

Elastic Stack 是一系列由 Elastic 公司开发的产品组件,能够安全可靠地获取任何来源、任何 格式的数据,然后实时地对数据进行搜索、分析和可视化。Elastic Stack 旧称 ELK Stack,主 要有 Elasticsearch,Logstash,Kibana,Beats 四种组件组成。

elk学习笔记-elasticsearch基础概念_搜索

以下是相关使用场景

elk学习笔记-elasticsearch基础概念_Elastic_02

Cluseter:集群,

elk学习笔记-elasticsearch基础概念_Elastic_03


Elasticsearch 集群由一个或多个节点组成,可通过其集群名称进行标识。通常这个 Cluster 的名字是可以在 Elasticsearch 里的配置文件中设置的。


以下是一个集群布局

elk学习笔记-elasticsearch基础概念_Elastic_04

Node

单个 Elasticsearch 实例。根据 node 的作用,可以分为如下的几种:

  • master-eligible:可以作为主 node。一旦成为主 node,它可以管理整个 cluster 的设置及 变化:创建,更新,删除 index;添加或删除 node;为 node 分配 shard
  •  data:数据 nodei
  • ngest: 数据接入(比如 pipepline)
  • machine learning (Gold/Platinum License)

一般来说,一个 node 可以具有上面的一种或几种功能。我们可以在命令行或者 Elasticsearch 的配置文件(elasticsearch.yml)来定义:

elk学习笔记-elasticsearch基础概念_搜索_05

elk学习笔记-elasticsearch基础概念_数据_06

Document

elasticsearch是面向文档的,这意味着索引或者搜索的最小单元是文档,文档有些重要属性

  • 独立,文档包含字段以及其值
  • 分层
  • 结构灵活

它一般采用JSON形式

Type

类型是文档的逻辑容器,类似于表是行的容器,每种类型的字段定义称为映射。在未来8.0版本中,type将会被彻底删除,默认情况下是_doc

Index

index是索引,是文档的集合。

elk学习笔记-elasticsearch基础概念_搜索_07

每个index一个或者多个documents组成,并且这些 document可以分布于不同的shard之中。index类似于数据库中database概念

elk学习笔记-elasticsearch基础概念_Elastic_08

shard

由于elasticsearch是一个分布式搜索引擎,因此索引通常会拆分分布在多个节点上的称为分片的元素。当创建一个索引的是时候,可以指定想要的分片的数量,(shard)。

  • 允许水平分割扩展内容容量
  • 允许分片进行分布式并行操作,提高性能和吞吐量

有两种类型的分片,primary shard和Replica shard

  • 每个文档都存储在一个 Primary shard。 索引文档时,它首先在 Primary shard 上编制索引,然后在此分片的所有副本上(replica)编制索引。索引可以包含一个或多个主分片。 此数字确定索引相对于索引数据大小的可伸缩性。 创建索引后,无法更改索引中的主分片数。
  • Replica shard: 每个主分片可以具有零个或多个副本。

默认情况下,每个主分片都一有一个副本,但是可以在现有的索引上动态更改副本数,永远不会在与其主分片相同的节点上启动副本分片。

elk学习笔记-elasticsearch基础概念_数据_09

elk学习笔记-elasticsearch基础概念_搜索_10


文档

程序中大多的实体或对象能够被序列化为包含键值对的JSON对象,键(key)是字段(field)或属性(property)的名字,值(value)可以是字符串、数字、布尔类型、另一个对象、值数组或者其他特殊类型,比如表示日期的字符串或者表示地理位置的对象。

元数据

一个文档不只有数据,还包含了元数据metadata,关于文档的信息,三个必须的元数据节点是:

  • _index :文档存储的地方
  • _type:文档代表的对象的类
  • _id:文档的唯一标识

索引

文档通过index api被索引,让数据可以被存储和搜索。

以下是一些创建的文档查询

#PUT /{index}/{type}/{id}
#设置id
PUT /website/blog/123

#获取文档
GET /website/blog/123?pretty

#获取文档的一部分
GET /website/blog/123?_source=title,text

#更新
PUT /website/blog/123
{
  "title": "My first blog entry",
  "text":  "I am starting to get the hang of this...",
  "date":  "2014/01/02"
}

#创建一个新文档POST /website/blog/
PUT /website/blog/123?op_type=create
{ ... }

PUT /website/blog/123/_create
{ ... }


#局部更新
POST /website/blog/1/_update
{
   "doc" : {
      "tags" : [ "testing" ],
      "views": 0
   }
}