资源
约定
ES:Elaticsearch
它是数据库吗?
首先是的,它是一种数据库。但它并不是传统意义上的关系型数据库。
它是一个基于搜索引擎技术的分布式 文档 数据库,用于存储、检索和分析海量的非结构化或半结构化数据。Elasticsearch支持大规模的数据存储和实时搜索,并提供了丰富的搜索、聚合和分析功能,可以被广泛用于全文搜索、日志分析、监控、安全分析、推荐系统等场景。
可以用关系型数据库,去理解 ES 数据库吗?
可以,也不可以,它们之间是有细微的区别的。
关系型数据库中有三块概念:数据库、数据表、实际内容。
其中,数据库是用来放一堆数据表的地方,不同的数据表又是存储对应实际内容的地方。就像下图这样:
看完关系型数据库的三块概念,你一定急着想去了解 ES 是什么样的了。不要着急,再听我说一点内容,了解 ES 这里分为
7.0版本之前7.0版本之后
7.0是一个分水岭,先记住这个,往后看就懂了。
先看一段Elasticsearch的代码
首先你要记得,ES 是一个文档型数据库。那么它的单位就是文档,而并不是表,虽然我们可以这样去映射它:文档 -> 表。
安装我们使用关系型数据库的习惯,我们需要先创建库,这里是创建索引:
Index 索引
这里出现了第一个概念:Index 索引
使用该语句创建一个索引:
PUT /my-index-000001
该语句创建了一个名为my-index-000001的索引,示例来自于官网:Create index API | Elasticsearch Guide [8.6] | Elastic
在 ES 中,Index(索引)是一个逻辑上的概念,它代表着一个包含有相似特征的一组文档集合。不要懵,记住 ES 是文档的集合!
Mapping
这里出现了第二个概念:Mapping
上文说到:Index 是一个 逻辑 概念,它代表一个有相似特征文档的集合,而Mapping 则定义了文档中的各个字段及其数据类型。那么我们是不是可以这样理解:
官方对应Mapping的定义有:Mapping | Elasticsearch Guide [8.6] | Elastic
- Dynamic mapping
- Explicit mapping
Dynamic mapping
大致意思就是说,如果你选择Dynamic mapping的方式,你可以快速探索你的数据,就像这样:
PUT data/_doc/1
{ "count": 5 }
该例子也是来自官网,有兴趣的朋友可以点击之前的链接查看关于Dynamic mapping的介绍。这个给出的例子和Elasticsearch权威指南中- 索引员工文档的示例一样。
使用该语法就表示,你已经创建了一个文档:
- 索引名:
data - 文档类型:
_doc - 唯一标识:
1 - 其中一个属性名叫
count的字段,从它的值推断,它是一个long类型。
Explicit mapping
使用这个方式,你就会很熟悉了,这跟定义表结构一样。我们直接来看一个例子,该例子是创建一个Index使用Explicit mapping定义文档样式:
PUT /my-index-000001
{
"mappings": {
"properties": {
"age": { "type": "integer" },
"email": { "type": "keyword" },
"name": { "type": "text" }
}
}
}
- 索引名:
my-index-000001 - 其中一个属性名叫
count的字段,从它的值推断,它是一个long类型。
你会发现文档的定义格式是以JSON为主,下面的格式是固定的,我们关注的是properties中定义的字段名和类型。
{
"mappings": {
"properties": {
}
}
}
OK,操作到这,你脑子里可能已经和上面给出的图一样了,这里只是教你去理解它。实际上,你可千万要记住:ES 是一个文档数据库!Index和Mapping是一种 “接口” 和 “实现” 的感觉,所以它们是不可分离的,而存储又是以Index的方式进行存储的,所以它应该是这样的:
好的,到现在你能大致理解ES的结构了吗?我理解外面那个圆柱就是ES的节点,在这里面我们定义(Index和Mapping)用于存储实际的数据。
如果你关心字段和类型,请看官网:Field data types | Elasticsearch Guide [8.6] | Elastic
当定义了Index索引之后,你会想办法插入一些数据,使用上面的my-index-000001索引,插入如下数据:
POST /my-index-000001/_doc/1
{
"age":18,
"email":"chengyunlai@cc.zz",
"name":"chengyunlai"
}
如果你懂RESTful风格编程,你就会明白前面POST指令是新增的意思。现在开始你的疑问,你会不会想问_doc/1是什么意思?这里我先解释
_doc:是一个默认标识,也就是必须要这样写。1:对插入该文档设置唯一标识ID(就和主键一样),如果不指定,Elasticsearch 会自动生成一个 ID。
现在针对这个_doc,肯定还是有疑问的,这个和版本历史有关,接下来我们了解一下7.0这个分水岭对_doc做了什么事?
7.0版本之前
在7.0之前,我们可以为每个索引自定义多个文档类型,例如:user。这个时候你会发现在7.0之前,它是这样的结构:
.
举个例子,其中的my_type就是自定义了一个类型:
PUT my_index
{
"mappings": {
"my_type": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
}
}
}
}
}
7.0版本之后
但在7.0之后,Elasticsearch 引入了一个新的概念,即唯一文档类型 _doc,每个索引都只能有一个文档类型 _doc,这意味着在新版本中,我们不能再使用自定义的文档类型名。
所以新版本中,一个Index就只能对应一种数据类型:_doc
总结:
先设置索引映射的样式:
PUT /my-index-000001
{
"mappings": {
"properties": {
"age": { "type": "integer" },
"email": { "type": "keyword" },
"name": { "type": "text" }
}
}
}
然后插入值,使用RESTFul风格。
POST /my-index-000001/_doc/1
{
"age":18,
"email":"chengyunlai@cc.zz",
"name":"chengyunlai"
}