elasticsearch概念

Posted wodeboke-y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了elasticsearch概念相关的知识,希望对你有一定的参考价值。

elasticsearch概念

 

1.      前言

它是一个数据库?但一般叫它搜索引擎

 

为什么需要这么一种数据存储及搜索模式?以下面的数据为例:

name:小明

id:007

info:巴拉巴拉巴拉巴拉

msg:巴拉巴拉巴拉巴拉

数据库的功能实际只有两种,存储,搜索;

  1. mysql:简单模式,关系数据库;关系数据库的问题是对于固定字段处理非常快(name,id),对于like匹配就不能满足需要了;
  2. mongodb:name和id一般不会太长,但msg可长可短,同时有些场景对关系映射的需求非常少,使用key/value数据库更方便读写;
  3. elasticsearch:上面两种数据库基本上是两个方向,事务可靠性/读写速率,但对于like匹配的支持没什么本质区别;

elasticsearch的方法就是把like匹配提前执行,从主体提取特征值,查询时从特征值表中查询对应的主体id,再返回主体;

把提取特征值抽象并扩大化就成了分词(就是除了我不要的,其它全提取);

这种由源表生成特征-源ID,然后从特征表中查询源ID,并据此返回源表对应行内容的方法就叫倒排索引。

其实都是数据库,不过使用场景不同。

 

2.      数据组织

Index

Elasticsearch 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。每个 Index (即数据库)的名字必须是小写。

 

Document

Index中单条的记录,类似于关系数据库中的记录。

每个文档存放于index,且拥有type和id属性。

索引中的原始json文档会被存放于_sourcefield,它会在检索时自动返回。

 

 

Type

Document 可以分组它是虚拟的逻辑分组,用来过滤 Document,类似 MySQL 中的数据表,MongoDB 中的 Collection。

在较新的版本中只能在一个index中设置一个type,至少在7.6.3版本中是_doc

基本上不需要关注它了。

 

Fields

即字段,每个 Document 都类似一个 JSON 结构,它包含了许多字段,每个字段都有其对应的值,多个字段组成了一个 Document,其实就可以类比 MySQL 数据表中的字段。

 

mapping(映射-约束)
数据如何存放到索引对象上,需要有一个映射配置,包括:数据类型、是否存储、是否分词等。

 

类比传统数据库:

Relational DB -> Databases -> Tables -> Rows -> Columns

Elasticsearch -> Indices   ->空  -> Documents -> Fields

其实index类似于表,但多出一堆附属结构,更像数据库一点。elastic可以认为不需要tables概念。

 

3.      分布式及高可用

分片(shard) :ES的“分片(shard)”机制可将一个索引内部的数据分布地存储于多个节点,它通过将一个索引切分为多个底层物理的Lucene索引完成索引数据的分割存储功能,这每一个物理的Lucene索引称为一个分片(shard)。

每个分片其内部都是一个全功能且独立的索引,因此可由集群中的任何主机存储。创建索引时,用户可指定其分片的数量,默认数量为5个。

Shard有两种类型:primary和replica,即主shard及副本shard。

Primary shard用于文档存储,每个新的索引会自动创建5个Primary shard,当然此数量可在索引创建之前通过配置自行定义,不过,一旦创建完成,其Primary shard的数量将不可更改。

Replica shard是Primary Shard的副本,用于冗余数据及提高搜索性能。

每个Primary shard默认配置了一个Replica shard,但也可以配置多个,且其数量可动态更改。ES会根据需要自动增加或减少这些Replica shard的数量。

 

Replica shard(副本分片)

每个主分片可以有零个或多个副本。副本是主分片的一个拷贝,有两个作用:

1、故障转移:如果主分片有问题,副本分片可以提升为主分片;

2、提高性能:获取和搜索请求可以处理主分片或副本分片。

默认情况下,每个主分片有一个副本,不过索引的副本数量可以动态地改变。在同一个节点上,一个副本分片将永远不会和其主分片一起运行。

 

Routing(路由值)

索引一个文档,它存储在一个主分片里。通过哈希路由项的值来匹配分片。默认情况下,路由值产生于文档的ID;如果该文档指定了父文档,则使用父文档的ID(用于保证父子文档都存储在同一分片)。

路由值可以在索引的时候指定数值,或者配置字段映射来指定。

 

4.      集群

Node 和 Cluster

Elasticsearch 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elasticsearch 实例。

单个 Elasticsearch 实例称为一个节点(Node)。一组节点构成一个集群(Cluster)。

 

5.      其它

source field

它代表文档的源字段,会在get及search时自动返回。使得通过搜索就可能得到源数据,不需要再根据id进行一次搜索。

 

以上是关于elasticsearch概念的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch 教程

Elasticsearch 教程

SpringBoot-spring-data-elasticsearch7.12.0

elasticsearcch部署

Elasticsearch后台运行步骤

Elasticsearch镜像打包记录