本章笔者和大家进一步去探索ES搜索引擎技术,深入去探索下ES的数据是如何检索、如何写入的。并结合具体命令和集群架构的形式,来看下在集群中检索和写入的原理。
笔者也结合自身理解,对他的流程进行绘图,方便大家更好的去想象这个检索流程,以便大家理解,如有分歧的地方,欢迎大家留言交流。
ElasticSearch批量操作文本与DSL语言入门(三)
深入理解文本类型keyword和text的存储和match和term关键字对数据的查询
定义映射字段
我们先通过mapping定义我们索引中数据字段类型,类似mysql的建表语句。
PUT es-db
{
"mappings": {
"properties": {
"text":{ //字段名称 可以自定义
"type": "text","index": true,"store": true //属性类型
},
"keyword":{
"type": "keyword","index": true,"store": true
}
}
}
}
属性类型
type : es的基础类型
index : index选项控制字段值是否被索引。它接受true或false,默认为true。为false的字段是不可查询的。
store: 表示我们是否要对其数据进行存储,这里举个例子,比如如果一个字段是一个很长的介绍页,我们在查询列表的时候其实是不需要这个字段所有的数据展示的,如果产品列表 ,有产品标题、名称 、简介,但是简介是不需要被展示出来的,但是简介要支持被搜索出来,这个时候相应简介这个字段属性可以被设置成 “index”: true,“store”: false。
存储数据
#存储数据
PUT es-db/_doc/1
{
"text":"ni hao e s",
"keyword":"ni hao e s"
}
match和term查询数据
# 查询
# term查询text文本
POST /es-db/_search
{
"query": {
"term": {
"text": "hao"
}
}
}
# term查询keyword文本
POST /es-db/_search
{
"query": {
"term": {
"keyword": "ni hao e s"
}
}
}
# match查询text文本
POST /es-db/_search
{
"query": {
"match": {
"text": "我hao"
}
}
}
# match查询keyword文本
POST /es-db/_search
{
"query": {
"match": {
"keyword": "ni hao"
}
}
}
通过图文的形式,相信大家也能很清晰的看出ES在我们写入和读取的时候,做到的一些操作。
结合集群架构,去理解分片和节点
集群架构
我们在配置es的时候有几个重要参数:
cluster.name:es-cluster 集群名称。
我们在多个es中配置同一个名称以便他们整合成同一组群。
node.name:node-1 节点名称。
discovery.seed_hosts:["ip-1:9200 ","ip-2:9200 ","ip-3:9200 "]
es通过ip发现其他节点。
cluster.initial_master_nodes: [“Node1”,“Node2”,“Node3”]
候选节点,es会从这些节点中选取出一个主节点为master节点,其余节点为DataNode节点。
注意: 在节点的配置上最好是单数。
Master节点
主要特点:
- 管理索引、创建删除、分配分片
- 维护元数据
- 管理集群节点状态
- 轻量级,不负责读写数据
只会有一个Master节点。
DataNode节点
主要特点:
- 会存在多个节点
- 数据的读写
- 数据的检索
- 承压最大,内存消耗最多的
分片与副本
分片:
Elasticsearch是一个分布式的搜索引擎,索引的数据也是分成若干部分,分布在不同的服务器节点中,分布在不用服务器节点中的索引数据,就是分片。
三个概念要清楚
一、分片是储存索引数据的。
二、一个索引(index)是由多个分片(shard)组成。
三、分片是存在集群中不同的服务节点上。
副本
Elasticsearch自身在集群和分布式中考虑到系统的稳定性和高可用,是会默认为分片创建副本分片。每个分片都会有一个主分片和若干副本分片。
我们可以理解成 一个分片的组成 包含:一个主分片和若干备用分片。(ES.7版本默认的话是 一个主一个备)
主分片和备用分片 分布在不同的节点上。
指定分片和副本命令:
#在put索引的时候
#创建es_index索引
PUT /es_index
{
"settings":{
"number_of_shards":3, #三个主分片
"number_of_replicas":2 # 备用2个
}
}
集群的数据插入原理
一、因为是插入操作,所以选择一个DataNode节点,假设选择了Node1。此时被选中的node1为协调节点。
二、计算我们插入的数据应该分配到哪个主分片中。如图 索引index-2 中存在三个 1、2、3主分片,分散在 三个节点上。假设计算后值为3。则我们需要路由到3主分片存在的节点node3上
三、Node1协调节点发挥路由的作用将请求路由到Node3.Node3节点接收到请求,将数据储存到对应的主分片上。在主分片写入好后 同步到两个备用分片上。
四、最后由相应的节点返回数据到客户端服务器。
集群的数据检索原理
一、因为是查询操作,同样是要在DataNode节点选取协调节点。假设还是选择了Node1。此时被选中的node1为协调节点。
二、将请求广播到每个节点上。各个节点上的分片处理请求。处理后,将满足条件的数据id、节点信息、分片信息,返还给协调节点(Node1)。
三、 满足条件的数据会在协调节点(Node1)上进行数据整理排序。
四、因为返回的数据有限,仅仅是id等,协调节点会通过各分片返回的id,再次向分片中获取详细数据。
五、将数据返回给客户端。
注:如图也可以看出,如果我的主分片过多,那么他的查询也会比较复杂,数据检索和存储的压力都是集中在DataNode节点上,所以我们首先对于分片数量的设计要合理,还有就是数据节点的配置不能很低。
Elasticsearch准实时索引实现
ES的不是完全实时读写的,他中间是有缓存机制,可以称之为准实时的。
也就会我们写入数据的时候不是能马上查询到的,是有中间间隔的。
感谢阅读,希望对你有帮助和启发~
我是 祥天 ,期望在提高自己的同时,输出较高质量的分享,感谢各位读者的:点赞、收藏 和 评论 ,我们一起加油~