前言
最近面试过程中遇到问Elasticsearch的问题不少,这次总结一下,然后顺便也了解一下Elasticsearch内部是一个什么样的结构,毕竟总不能就只了解个倒排索引吧。本文标题就是我遇到过的两个问题,所以此次基本上只是围绕着这两个问题来总结。
ES写入数据
在介绍写入数据的过程时,先明确一下ES中的一些关键性的概念:
- Clouster:集群,由一到N个Elasticsearch服务节点组成。
- Node:节点,组成Elasticsearch集群的基本单元,单个集群内节点名称唯一。通常一个节点中分配一到多个分片。
- Shards:分片,当ES的索引数据过大时,会进行水平拆分,拆分出来的每一个单元都称为分片。在进行写入数据的时候,会通过路由来确定具体写到哪个分片上,所以在创建索引的时候就要确定好分片数量,并且一旦确定不可更改。索引数据在经过分片后,在数据管理和性能上都有很大提升,并且每一个分片都是一个Lucende的索引,每个分片都必须有一个主分片和零到多个副分片。
- Replicas:副本或备份,副本是指对主分片的备份分片,无论是主分片还是副本分片都可以对外提供查询服务。但是写入操作时是先写入主分片,然后再分发到副本上。
当主分片不可用时会在副本分片上选举一个作为主分片,因此副本不仅可以保证系统的高可用性,还可以提升搜索时的并发性能(主副分片都可以提供查询)。但并不是副本越多越好,副本数量过多会导致数据同步的负担过大。
分片数 (副本数+1)= 所需的最大节点数
举例:你计划5个分片和1个副本,那么所需要的最大的节点数为:5(1+1)=10个节点。
- Index:索引,由一个和多个分片组成,单个集群内索引名字是唯一的。
- Type:类型,指索引内部的逻辑分区,一般是通过Type的名字来进行分区,若是查询条件中没有该值,则说明在整个索引中执行查询。
- Document:文档,ES索引中的每一条数据都称为一个Document,基本上和关系型数据库中的一个记录意思相同,通过_id,在Type内进行唯一标识。
- Settings:对集群中索引的设定,例如默认的分片数量,副本数等信息。
- Mapping:这里的Mapping类似于,关系型数据库的表结构信息,这里面包含了索引中字段的存储类型,分词方式,是否分词等信息。
Elasticsearch中的Mapping是可以动态识别的,Elasticsearch字段的数据格式识别它的类型,但是若是需要对Filed字段进行特殊设置时,就需要手动创建Mapping了。注意:一个Mapping一旦创建成功后,若是已经存储了数据了,就不可以修改了。 - Analyzer:字段的分词方式的定义,一个Analyzer,通常由一个Tokenizer&#