大家好,我是咔咔不期速成,日拱一卒
项目中准备使用ElasticSearch,之前只是对ElasticSearch有过简单的了解没有系统的学习,本系列文章将从基础的学习再到深入的使用。
咔咔之前写了一份死磕MySQL文章,如今再入一个系列玩转ElasticSearch。
本期文章会带给大家学习ElasticSearch的基础入门,先把基础学会再深入学习更多的知识点。
一、基本概念
文档(Document)
ElasticSearch是面向文档的,文档是所有可搜索数据的最小单位,例如MySQL的一条数据记录
文档会被序列化成为json格式,保存在ElasticSearch中
每个文档都有一个唯一ID,例如MySQL中的主键ID
JSON文档
一篇文档包括了一系列的字段,例如数据中的一条记录
json文档,格式灵活,不需要预先定义格式
在上期文章中把csv文件格式文件通过Logstash转化为json存储到ElasticSearch中
文档的元数据
index:文档所属的索引名
type:文档所属类型名
id:文档唯一ID
source:文档的原始JSON数据
version:文档的版本信息
score:相关性分数
索引
索引是文档的容器,是一类文档的结合,每个索引都有自己的mapping定义,用于定义包含的文档的字段和类型
每个索引都可以定义mapping,setting,mapping是定义字段类型,setting定义不同的数据分布
Type
7.0之前,一个Index可以设置多个type,所以当时大多数资料显示的都是type类型与数据库的表
7.0之后,一个索引只能创建一个type“_doc”
若不好理解,可以对比MySQL类比一下
节点
节点是一个ElasticSearch的实例,本质上就是java的一个进程,一台机器可以运行多个ElasticSearch进程,但生产环境下还是建议一台服务器运行一个ElasticSearch实例
每个节点都有名字,通过配置文件配置,或者启动时-Enode.name=node1
每个节点在启动后,会分配一个UID,保存在data目录下
主节点:master
默认情况下任何一个集群中的节点都有可能被选为主节点,职责是创建索引、删除索引、跟踪集群中的节点、决定分片分配给相应的节点。索引数据和搜索查询操作会占用大量的内存、cpu、io资源。因此,为了保证一个集群的稳定性,应该主动分离主节点跟数据节点。
数据节点:data
看名字就知道是存储索引数据的节点,主要用来增删改查、聚合操作等。数据节点对内存、cpu、io要求比较高,在优化的时候需要注意监控数据节点的状态,当资源不够的时候,需要在集群中添加新的节点。
负载均衡节点:client
该节点只能处理路由请求,处理搜索,分发索引等操作,该节点类似于Nginx的负载均衡处理,独立的客户端节点在一个比较大的集群中是非常有用的,它会协调主节点、数据节点、客户端节点加入集群的状态,根据集群的状态可以直接路由请求。
预处理节点:ingest
在索引数据之前可以先对数据做预处理操作,所有节点其实默认都是支持ingest操作的,也可以专门将某个节点配置为ingest节点。
分片
分片分为主分片,副本分片
主分片:用以解决数据水平扩展的问题,将数据分布到集群内的所有节点上,一个分片是一个运行的Lucene(搜索引擎)实例,主分片数在创建时指定,后续不允许修改,除非Reindex
副本:用以解决数据高可用的问题,可以理解为主分片的拷贝,增加副本数,还可以在一定程度上提高服务的可用性。
在生产环境中分片的设置有何影响
分片数设置过小会导致无法增加节点实现水平扩展,单个分片数据量太大,导致数据重新分配耗时。假设你给索引设置了三个主分片,这时你给集群加了几个实例,索引也只能在三台服务器上
分片数设置过大导致搜索结果相关性打分,影响统计结果的准确性,单个节点上过多的分片,会导致资源浪费,同时也会影响性能
从ElasticSearch7.0开始,默认的主分片设置为1,解决了over-sharding的问题
查看集群健康状态
执行接口
get_cluster/health
green:主分片与副本都正常分配
yellow:主分片全部正常分配,有副本分片未能正常分配
red:有主分片未能分配,当服务器的磁盘容量超过85%时创建了一个索引
二、ResultApi
三、文档的基本CRUD操作
create一个文档
支持自动生成文档ID和指定文档ID两种方式
通过调用post/movies/_doc系统会自动生成文档ID
使用