ElasticSearch-深入理解数据检索与写入原理(四)

本章笔者和大家进一步去探索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节点。

ES集群

注意: 在节点的配置上最好是单数。

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}
}

Es集群和分片

集群的数据插入原理

集群的数据插入原理

一、因为是插入操作,所以选择一个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的不是完全实时读写的,他中间是有缓存机制,可以称之为准实时的。

也就会我们写入数据的时候不是能马上查询到的,是有中间间隔的。

Elasticsearch准实时索引实现
感谢阅读,希望对你有帮助和启发~

在这里插入图片描述
我是 祥天 ,期望在提高自己的同时,输出较高质量的分享,感谢各位读者的:点赞收藏评论 ,我们一起加油~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值