ES入门(二),基本概念
基础概念部分
Cluster(集群)
cluster(集群)是一个或者多个节点的集合,它们一起保存数据并且提供所有节点联合索引以及搜索功能。集群存在一个唯一的名字身份且默认为 “elasticsearch”。
Node(节点)
node(节点)是一个单独的服务器,它是集群的一部分,存储数据,参与集群中的索引和搜索功能。像一个集群一样,一个节点通过一个在它启动时默认分配的一个随机的 UUID(通用唯一标识符)名称来识别。
index(索引)-类似传统数据库中的数据库(虚拟逻辑空间概念)
-
index(索引)是具有稍微类似特征文档的集合。例如,您有一个消费者数据的索引,一个产品目录的索引,和另一个是订单数据的索引。一个索引通过名字(必须全部是小写)来标识,并且该名字在对 document(文档)执行 indexing(索引),search(搜索),update(更新)和 delete(删除)操作时会涉及到。
-
作为动词:存储数据到 Elasticsearch 的行为叫做 索引 ,但在索引一个文档之前,需要确定将文档存储在哪里。
-
mappings,定义文档字段的类型
-
settings,定义不同的数据分布
Type(类型)-类似传统数据库中的表-(虚拟逻辑空间概念)
在 Index(索引)中,可以定义一个或多个类型。一个类型是索引中一个逻辑的种类/分区,它的语义完全取决于您自己。一般情况下,一个类型被定义成一组常见字段的文档。
在7.0版本之后,一个index只可以拥有一个type
Document(文档)-类似于传统数据库中的一条纪录
document(文档)是索引信息的基本单位。例如,您有一存储 customer(客户)数据的文档,另一个是存储 product(产品)数据的文档,还有一个是存储 order(订单)数据的文档。该文档可以使用 JSON 来表示,它是一种无处不在的互联网数据交换格式。
Shards & Replicas(分片 & 副本)— (真实存在)
- 一个索引可以有多个分片,用于存储大量数据
- 副本是对于分片的副本,是为防止发生意外而对数据的备份
更多 https://elasticsearch.apachecn.org/#/docs/1
文档的元数据 Meta
-
元数据,用于标注文档的相关信息
- _index: 文档所属索引名
- _type: 文档所属类型名
- _id: 文档的唯一ID
- _source: 文档的原始JSON数据
- _all: 整合所有字段内容到该字段,已被废除
- _version: 文档版本信息,用于解决并发冲突
- _source: 相关性打分
-
需要通过Kibana导入Sample Data的电商数据。具体参考“2.2节-Kibana的安装与界面快速浏览”
与传统数据库对比
RDBMS | ElasticSearch |
---|---|
Table | Index |
Row | Document |
Column | Field |
Row | Document |
Schema | Mapping |
SQL | DSL |
分布式系统的可用性和拓展性
elasticsearch属于分布式系统,具有高可以性,和可扩展性
-
高可用性
- 服务可用性:允许所有节点停止服务
- 数据可用性:部分节点丢失,不会丢失数据
-
可扩展性
- 请求量提升/数据的不断增长(将数据分配到所有节点上)
基本概念(1)- 索引,文档和 REST API
Index 相关 API
#查看索引相关信息
GET kibana_sample_data_ecommerce
#查看索引的文档总数
GET kibana_sample_data_ecommerce/_count
#查看前10条文档,了解文档格式
POST kibana_sample_data_ecommerce/_search
{
}
#_cat indices API
#查看indices
GET /_cat/indices/kibana*?v&s=index
#查看状态为绿的索引
GET /_cat/indices?v&health=green
#按照文档个数排序
GET /_cat/indices?v&s=docs.count:desc
#查看具体的字段
GET /_cat/indices/kibana*?pri&v&h=health,index,pri,rep,docs.count,mt
#How much memory is used per index?
GET /_cat/indices?v&h=i,tm&s=tm:desc
相关阅读
- 为什么不再支持单个Index下,多个Tyeps https://www.elastic.co/cn/blog/moving-from-types-to-typeless-apis-in-elasticsearch-7-0
- CAT Index API https://www.elastic.co/guide/en/elasticsearch/reference/7.1/cat-indices.html
基本概念(2):节点,集群,分片及副本
课程Demo
- 需要通过Kibana导入Sample Data的电商数据。具体参考“2.2节-Kibana的安装与界面快速浏览”
get _cat/nodes?v
GET /_nodes/es7_01,es7_02
GET /_cat/nodes?v
GET /_cat/nodes?v&h=id,ip,port,v,m
GET _cluster/health
GET _cluster/health?level=shards
GET /_cluster/health/kibana_sample_data_ecommerce,kibana_sample_data_flights
GET /_cluster/health/kibana_sample_data_flights?level=shards
#### cluster state
The cluster state API allows access to metadata representing the state of the whole cluster. This includes information such as
GET /_cluster/state
#cluster get settings
GET /_cluster/settings
GET /_cluster/settings?include_defaults=true
GET _cat/shards
GET _cat/shards?h=index,shard,prirep,state,unassigned.reason
相关阅读
- CAT Nodes API https://www.elastic.co/guide/en/elasticsearch/reference/7.1/cat-nodes.html
- Cluster API https://www.elastic.co/guide/en/elasticsearch/reference/7.1/cluster.html
- CAT Shards API https://www.elastic.co/guide/en/elasticsearch/reference/7.1/cat-shards.html
单个文档操作CRUD
1.增加文档
- POST index/type/ 自动生成ID
############Create Document############
#create document. 自动生成 _id
POST users/_doc
{
"user" : "Mike",
"post_date" : "2019-04-15T14:12:12",
"message" : "trying out Kibana"
}
注意:Es在7.0版本之后统一使用_doc代替type
- PUT index/type/id?op_type=create 指定ID,若ID已存在,报错
#create document. 指定Id。如果id已经存在,报错
PUT users/_doc/1?op_type=create
{
"user" : "Jack",
"post_date" : "2019-05-15T14:12:12",
"message" : "trying out Elasticsearch"
}
- PUT index/_create/id 指定 ID 如果已经存在,就报错
#create document. 指定 ID 如果已经存在,就报错
PUT users/_create/1
{
"user" : "Jack",
"post_date" : "2019-05-15T14:12:12",
"message" : "trying out Elasticsearch"
}
- PUT index/type/id 指定ID,如果已经存在,则先删除旧数据,再插入新数据
PUT users/_doc/1
{
"user" : "Mike"
}
因此,此API不可用于增加某个文档的字段,因为它会删除原来的文档数据,若要更新,则使用_update API,见下文
2.更新文档
- POST index/_update/id 更新指定ID的文档
#在原文档上增加字段
POST users/_update/1/
{
"doc":{
"post_date" : "2019-05-15T14:12:12",
"message" : "trying out Elasticsearch"
}
}
3.删除文档
- DELETE index/type/id 删除指定ID的文档
### Delete by Id
# 删除文档
DELETE users/_doc/1
4.获取文档
由于篇幅的限制,这里只提及简单获取
- GET index/type/id 通过ID获取单个文档
### Get Document by ID
#Get the document by ID
GET users/_doc/1
文档批量操作的CRUD
1._bulk操作
### Bulk 操作
#执行两次,查看每次的结果
#执行第1次
POST _bulk
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test2", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }
#执行第2次
POST _bulk
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test2", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }
注意点
- 支持在一次API中,对不同的索引进行操作
- 支持四种类型操作 index create update delete
- 可以在URL中指定Index,也可以在请求的Playload中进行
- 操作中单条失败,并不会影响其他操作
- 返回结果包括了每一条操作执行的结果
2._mget批量读取数据
GET /_mget
GET /index/_mget
### mget 操作
GET /_mget
{
"docs" : [
{
"_index" : "test",
"_id" : "1"
},
{
"_index" : "test",
"_id" : "2"
}
]
}
#URI中指定index
GET /test/_mget
{
"docs" : [
{
"_id" : "1"
},
{
"_id" : "2"
}
]
}
# 自定义每个查询
GET /_mget
{
"docs" : [
{
"_index" : "test",
"_id" : "1",
"_source" : false
},
{
"_index" : "test",
"_id" : "2",
"_source" : ["field3", "field4"]
},
{
"_index" : "test",
"_id" : "3",
"_source" : {
"include": ["user"],
"exclude": ["user.location"]
}
}
]
}
3._msearch批量查询(包含查询体)
POST index/_msearch
### msearch 操作
POST kibana_sample_data_ecommerce/_msearch
{}
{"query" : {"match_all" : {}},"size":1}
{"index" : "kibana_sample_data_flights"}
{"query" : {"match_all" : {}},"size":2}
相关阅读
- Document API https://www.elastic.co/guide/en/elasticsearch/reference/7.1/docs.html