elasticsearch-基本概念

2020-11-11 17:28:55 浏览数 (1)

先类比 elasticsearch 和 关系型数据库对应的某些概念,了解ES的结构:

索引:简单理解成数据库

分片:一个索引由多个分片组成,应用程序向ES请求的时候,是向索引请求,但是实际上工作的是分片,每个分片都是一个Lucene(搜索引擎),需要占用一定的内 存,CPU,磁盘等物理资源,他是一个最小工作单位,是实际能跑的一个程序。

  主分片:主分片比起副分片,多出的功能只是提供写入文档(索引文档,在ES的官方文档中,经常会同义"索引"和"写入")

  副分片:类似HDFS中的Replica,或者更像是数据库主从复制中的 从数据库,只提供读功能

  如果一个ES集群只有一个主分片,那么整个索引的所有数据都在这个主分片里,无论有多少个副分片,和只有一个主数据库同理。

  如果一个ES集群有两个主分片,无论多少个副分片,那么整个索引的数据分布在这两个主分片里,类似与关系型数据库分库,横切数据库表

  N个主分片,以此类推。

类型:分片的数据的组成部分,每个部分代表一类事务。

文档:相当于关系型数据库中的一行记录,ES的实质是 分布式文档存储系统

id:类似与关系型数据库中行记录的主键

域:相当于字段

elasticsearch 存在两种获得文档的方式:

  1.根据域(字段)搜索

  2.ID直达

两种获取方式的速度都挺快,因为elasticsearch对同一条文档(记录)存储了两种数据结构

正排索引和倒排索引

省略掉偏移量之类的属性,我们只看简单的查找过程

下图第一个是正排索引,可以简单理解成我们存储进去的内容,并且每条文档有唯一的标识(id)确认

映射其实就是对类似关系型数据库的表的类型进行域(字段)定义,比如 age 是 integer......

映射还可以指明一个域是否可以被解析,如果可以的话,可以在映射指定相应的解析器

第二个是倒排索引,在存入文档的时候,都需要将存入的文档(一条记录)中需要分析(analyse)的域进行分析器分析

比如 I love your sister,一般使用英语分析器分词,分词后分出的单元叫做 term,比如这句话会被分为 I , love , your , sister 这四个term。

当然,有一些分析器有去除无用词功能,比如 the , a 这些无太大意义的词会被去除。

对于可分析的域,查询的值也要通过相同的分析器进行分析,然后进行检索,比如查询 love your,那么 也会按照上面同样的解析器解析查询的值,解析成 your ,sister 两个term然后再用倒排索引检索

查询这种可解析的域 叫做 全文域查询

如果一个域是不可分析的,那么查询的值本身就是一个term,这种查询叫做 精确值查询

文档中的字段,无论是否可解析,都会被建立倒排索引,所以把一条记录写入到ES中,“写入”被称为“索引”

面向对象表示和处理了真实世界中潜在的各种复杂数据结构,ES的每条文档都代表一个对象,当然,对象中可以嵌套对象,文档指的是嵌套结构中最顶层的对象

全文域可以理解成,我们需要做的是去这整个全文里去查找是否包含我们的查询值,比如某篇文章里面找地址

分出 term 后,会根据 term 构建 倒排索引,比如下面的 term : “南山”,会记住相关的文档的唯一标识

当然存储方式不一定如下图,因为这样的话要线下时间去遍历出文档的唯一索引,一种假设的方法是当相关文档数太多的时候,可以使用查找树结构或B 数结构

ES使用简单的 Resful 风格的 API ,索引 类型 id可以唯一标识一个文档(一条记录),使用不同的请求方法可以 进行不同操作,比如删除,新增,修改

GET or POST or PUT...  /索引名/类型名/id

需要注意的是 ES 是不支持修改的,名义上是修改,但实际上是 将原本的内容 读出 转换成 JSON ,然后修改 ,修改后写会索引,同时删除旧文档。

ES可以全量替换掉某个id的文档,实际过程也是 删除 - 新增

0 人点赞