elasticsearch概念
Posted wodeboke-y
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了elasticsearch概念相关的知识,希望对你有一定的参考价值。
elasticsearch概念
1. 前言
它是一个数据库?但一般叫它搜索引擎
为什么需要这么一种数据存储及搜索模式?以下面的数据为例:
name:小明
id:007
info:巴拉巴拉巴拉巴拉
msg:巴拉巴拉巴拉巴拉
数据库的功能实际只有两种,存储,搜索;
- mysql:简单模式,关系数据库;关系数据库的问题是对于固定字段处理非常快(name,id),对于like匹配就不能满足需要了;
- mongodb:name和id一般不会太长,但msg可长可短,同时有些场景对关系映射的需求非常少,使用key/value数据库更方便读写;
- 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概念的主要内容,如果未能解决你的问题,请参考以下文章