橘子学ES05之索引和文档

本文主要介绍ES中的数据组成结构单元。

一、文档(Document)

1、概念

1、ES的数据存储单元是面向文档的,文档是所有数据存储,搜索的最小单元。
你可以把ES中的文档对应成mysql中的一条条数据记录。到时候你存进ES的数据就是一个个文档。

2、文档存入ES是序列化成为JSON格式的。
众所周知,json对象是由字段组成的。
每个字段都有对应的字段类型,包括字符串,数字,布尔,日期,二进制,范围类型。

3、每个文档都有一个Unique ID,
也就是唯一标识,可以对应Mysql表中的主键。
ES中这个ID可以自己指定,也可以由ES自动生成。我们上一篇导入logstash配置的时候那个id就是指定的唯一标识键。

2、数据结构

一个JSON文档包含了一系列的字段,类似数据库中表的各个字段属性列。
JSON文档的格式灵活,不需要你强制的预先定义格式。

  • 其中字段的类型可以人为指定,或者是通过ES自动推算。
  • 支持数组格式,支持数据的嵌套。

3、文档的元数据

随便去Kibana中查一个数据如下:

 {
        "_index" : "movies",
        "_type" : "_doc",
        "_id" : "5233",
        "_score" : 1.0,
        "_source" : {
          "@version" : "1",
          "title" : "Road to Utopia",
          "id" : "5233",
          "year" : 1946,
          "genre" : [
            "Comedy"
          ]
        }
 }

我们看到有这么几个东西组成:这几个组成就是文档的一个元数据。
1、_index:表示这个文档数据属于哪个索引
2、_type:表示文档所属的类型,类型7.0基本没意义了,都是_doc
3、_id:表示这个文档的唯一标识,也就是上面说的类似主键。
4、_score:表示这个文档在本次检索中的相关性打分,这个在全文检索中有重要作用。
5、_source:这里面放的就是你文档的真实内容。就是那个json文档,文档中有一个@version是文档的版本,这个版本每次修改都会递增,利用这个可以做乐观锁,CAS在并发修改的时候控制线程安全。
而且也看到文档json中有字符串,有时间,还有个数组。各种类型都有,json数据格式的灵活性得以展示。

二、索引(index)

1、概念介绍

先使用语句查看一下索引的结构。
橘子学ES05之索引和文档_第1张图片
我们看到这个索引的一个结构组成。

  • index也就是索引是文档的容器,是一类文档的集合。你可以理解为Mysql中的表这个概念。

    • 每个索引都有自己的一个mapping定义,用于定义包含文档的字段名和字段类型,你可以对应理解为mysql中的表结构定义。定义好文档字段的类型,名称。
    • shard体现的存储的维度,索引中的数据会分散在shard分片上。
  • 索引的Mapping和Settings

    • Mapping定义的是文档字段的类型,就像Mysql的字段类型。表结构。
    • Setting定义不同的数据分布,比如在那个分片,去哪个节点这种。后续看。

2、语境理解

索引在不同的语境中是不同的意思。
在ES中当你说你索引一个文档,就是把这个文档插入ES。
当你说一个索引,那就是名词,就是一个索引结构。
在MYSQL中可能是B+树索引。ES中还有倒排索引。

三、Type(类型)

ES在7.0之前是有type这个概念的,一个Index可以设置多个types,那时候Index类似数据库,typel类似表,这个组成。
6.0开始的时候type就被逐步废弃。7.0开始,一个索引只有一个Type就是_doc,也就是一个库一个表,这时候库就是表了,这时候我们就说一个Index类似一个表。
此时es的结构和mysql的结构就可以用下面这个表格做对应理解,其实不是那么契合的。就是帮助理解而已。
橘子学ES05之索引和文档_第2张图片
ES偏重于全文检索,mysql还是提供事务级别的支持比较好。看你的使用场景去选择不同的存储介质。

四、Rest Api

ES的检索提供了完整的rest的api调用来实现。
橘子学ES05之索引和文档_第3张图片

1、kibana的索引管理

橘子学ES05之索引和文档_第4张图片
在这个管理里面可以看到当前ES的所有的索引可以查看索引的详细信息。
橘子学ES05之索引和文档_第5张图片
点击索引进去看到详细信息。
橘子学ES05之索引和文档_第6张图片

2、rest api

# 查询ES索引下的数据量
GET _cat/indices/movies?v

# 查询ES索引下的mapping关系
GET /movies/_mapping

# 查询ES当前环境下索引对应的数据量
GET _cat/indices?v

五、总结

其实ES终归还是个数据库类似的东西,还是存储数据的。既然是存储数据必然就有类似的存储结构,只需要类比记忆就行了,知道哪些结构以后存的时候做到有的放矢。

你可能感兴趣的:(数据库,#,ES,elasticsearch,数据库)