Elasticsearch学习笔记:初识一些定义

259 阅读5分钟

资源

Elasticsearch: 权威指南 | Elastic

官方文档

约定

ESElaticsearch

它是数据库吗?

首先是的,它是一种数据库。但它并不是传统意义上的关系型数据库。

它是一个基于搜索引擎技术的分布式 文档 数据库,用于存储、检索和分析海量的非结构化或半结构化数据。Elasticsearch支持大规模的数据存储和实时搜索,并提供了丰富的搜索、聚合和分析功能,可以被广泛用于全文搜索、日志分析、监控、安全分析、推荐系统等场景。

可以用关系型数据库,去理解 ES 数据库吗?

可以,也不可以,它们之间是有细微的区别的。

关系型数据库中有三块概念:数据库数据表实际内容

其中,数据库是用来放一堆数据表的地方,不同的数据表又是存储对应实际内容的地方。就像下图这样:

image.png

看完关系型数据库的三块概念,你一定急着想去了解 ES 是什么样的了。不要着急,再听我说一点内容,了解 ES 这里分为

  1. 7.0版本之前
  2. 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定义了文档中的各个字段及其数据类型。那么我们是不是可以这样理解:

image.png

官方对应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 是一个文档数据库!IndexMapping是一种 “接口” 和 “实现” 的感觉,所以它们是不可分离的,而存储又是以Index的方式进行存储的,所以它应该是这样的:

image.png

好的,到现在你能大致理解ES的结构了吗?我理解外面那个圆柱就是ES的节点,在这里面我们定义(IndexMapping)用于存储实际的数据。

如果你关心字段和类型,请看官网: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之前,它是这样的结构:

image.png.

举个例子,其中的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"
}