ES(ElasticSearch)技术栈简介

ElasticSearch简介

Elaticsearch,简称为es, es是一个基于apache开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

ElasticSearch应用方向

  • 1- 信息检索
  • 2- 企业内部系统搜索
  • 3- 数据分析引擎:Elasticsearch 聚合可以对数十亿行日志数据进行聚合分析,探索数据的趋势和规律

ElasticSearch特点

1- 海量数据存储和处理:
大型分布式集群(数百台规模服务器)
处理PB级数据
也可以进行单机部署
2- 开箱即用:
简单易用, 操作非常简单
快速部署生产环境
3- 作为传统数据库的补充:
传统关系型数据库不擅长全文检索(MySQL自带的全文索引,与ES性能差距非常大)
传统关系型数据库无法支持搜索排名、海量数据存储、分析等功能
Elasticsearch可以作为传统关系数据库的补充,提供RDBMS无法提供的功能

ElasticSearch架构及其基本概念

ES相关角色:

Master: 主节点
	作用:  
		负责管理从节点, 负责从节点的监控状态监控
		负责接收客户端的请求, 负责将请求转发给datanode处理
		维护元数据信息: 索引 索引类型 属性 属性类型 分词器 分片 副本等
	注意:
		1- 集群架构可以分成分布式和单机版。单机版的时候,该节点既是主节点也是从节点
		2- 当是分布式的时候,主节点是一个轻量级的节点,尽可能不会去存储数据,即使存储也只存放从副本,只负责数据的读

DataNode: 从节点
	作用:
		负责具体处理客户端请求操作的节点, CURD(插入数据、更新数据、删除数据)索引数据
		当数据有分片和副本的情况, 写入数据到从节点时, 负责把数据同步到其他的节点
	注意: 数据写入请求,会被发送到从节点,先写入到从节点中的主副本,再从主副本同步到其他从副本。也就是从节点上可能有主副本,也可能有从副本。

ES(ElasticSearch)技术栈简介_第1张图片
ES与传统关系型数据库结构对比:

Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices   -> Types  -> Documents -> Fields

ES中相关的专有名词:

index :  索引 表示索引库, 一个es下可以有多个索引库
settings : 主要对索引库分片 和副本的设置 , 默认 有  5分片  2副本
type : 在一个索引库下, 可以有多个type类型, 类似于在一个数据库中可以有多个表
	注意: 目前新的版本中, 已经只允许创建一个type(_doc)
filed:  字段, 从一个type下可以有个字段, 类似于 在一个表中可以有一个列
mapping:  映射关系, 主要是对字段进行相关的设置的
	比如: 字段类型 字段是否需要进行分词  字段的原始数据是否保存...
document: 文档, 表示的每一行的数据
cluster: 集群, es的集群
node:   es的节点
shards :   分片  默认 一个索引库有 5个
replicas:  副本 默认 每一个分片 都有一个副本加上本身 为 2个
Index索引创建完成以后,可以任意时间动态修改副本的数量;但是不能修改分片的数量
	如果后续数量增大了,分片数量不够了如何解决?
	1- 先创建一个具有更多分片的新Index索引库
	2- 后续的新数据写入到这个新的Index索引库
	3- 旧的Index索引库数据导入到新的Index索引库

ElasticSearch的安装

需要注意的是ES不支持root用户安装, 必须使用普通用户

问题: 解决单节点告警问题

由于当前ES为单节点, 在构建一个新的索引库的时候, 依然会产生多个分片和副本的情况(默认), 但是只有一个节点, 多余的副本就无法放置, ES会变为告警状态(黄色)

解决思路: 修改副本数量为1即可

curl -XPUT http://192.168.88.166:9200/_settings?pretty -d '{ "index": { "number_of_replicas": 0 } }' -H "Content-Type: application/json"

ES的基本使用

字段类型

  • es的类型
    • 基本数据类型:text | keywords => string
      text是可以进行分词字符串类型
      keywords是不能进行分词,
      long,
      float,
      date,
      binary
    • 地址位置相关的类型
      geo_point,geo_shape
    • 分词器
      分词器是针对一段文本,进行词的拆分方式
    • 分词类型
      standard analyse:英文分词器,标准分词器
      IK analyse:一种中文分词器
      JieBa:另外一种分词器
  • 完整数据类型
    • https://www.elastic.co/guide/en/elasticsearch/reference/7.10/mapping-types.html

ES-SQL

ES SQL特点:

  • 本地集成
    • Elasticsearch SQL是专门为Elasticsearch构建的。每个SQL查询都根据底层存储对相关节点有效执行。
  • 没有额外的要求
    • 不依赖其他的硬件、进程、运行时库,Elasticsearch SQL可以直接运行在Elasticsearch集群上
  • 轻量且高效
    • 像SQL那样简洁、高效地完成查询
  • 目前支持单表查询
SELECT select_expr [, ...]
[ FROM table_name ]
[ WHERE condition ]
[ GROUP BY grouping_element [, ...] ]
[ HAVING condition]
[ ORDER BY expression [ ASC | DESC ] [, ...] ]
[ LIMIT [ count ] ]
[ PIVOT ( aggregation_expr FOR column IN ( value [ [ AS ] alias ] [, ...] ) ) ]
  • es cli的官方指导文档:

    • https://www.elastic.co/guide/en/elasticsearch/reference/7.10/sql-cli.html
      • https://www.elastic.co/guide/en/elasticsearch/reference/7.10/sql-cli.html
        • https://www.elastic.co/guide/en/elasticsearch/reference/7.10/sql-syntax-show-tables.html
  • es sql简单操作

    • es-sql不适合做表关联查询
    • es-sql开源版支持的功能有限
    • 官方网站:https://www.elastic.co/guide/en/elasticsearch/reference/7.10/sql-syntax-select.html
  • es只适合单表,大宽表存储,类似于hbase、mongo
    ElasticSearch目前不支持对多表关联查询。
    在这里插入图片描述

ES的Python代码编程

from elasticsearch import Elasticsearch

if __name__ == '__main__':
    # 1- 创建ES连接
    es = Elasticsearch(hosts=["192.168.88.166:9200"])

    # 2- CRUD操作
    # 新增数据
    res = es.index(index="job_idx",id=1000001,body={"salary":"1000001"})
    print(res)

    # 更新数据
    res = es.update(index="job_idx",id=1000001,body={"doc":{"salary":"1000002"}})
    print(res)

    # 查询
    res = es.search(index="job_idx",body={"query": {"ids": {"values": ["1000001"]}}})
    print(res)

    # 删除
    res = es.delete(index="job_idx",id=1000000)
    print(res)

    # 3- 释放资源
    es.close()

ES的相关原理

ES的写入数据的流程

ES(ElasticSearch)技术栈简介_第2张图片

1- 客户端进行数据写入操作,随机连接一台节点。连接上谁,那么谁就成为了协调节点(coordinating node),并且也是该次请求的管理者

2- 协调节点计算当前写入的数据应该存放到哪个分片的主副本上,底层是基于文档ID的Hash取模方案

3- 判断成功以后,找到对应分片的主副本。如果该主副本就在当前协调节点,直接写入即可;如果不在当前节点,需要将请求转发给到对应的分片的主副本所在的节点

4- 对应的主副本节点接收到数据写入请求后,执行数据写入操作。写入成功以后并且将数据同步到其他从副本中

5- 当主副本和从副本都对数据同步完成以后,最终将写入成功的请求由协调节点返回给到客户端

ES的读取数据的流程

ES(ElasticSearch)技术栈简介_第3张图片

1- 客户端发送数据查询的请求,连接任意一台ES节点。连接上谁,谁就是协调节点(coordinating node),并且也是该次请求的管理者

2- 根据查询的方案: 
	2.1- 如果是基于文档ID的查询,此时会计算当前这个ID对应的数据存放在哪个分片上,接着将请求转发给到对应的分片的副本
	2.2- 如果不是基于文档ID的查询,例如通过文本内容关键字查询,此时需要将该查询需求广播给到所有的节点,由各个节点查询自己服务器上的数据,并且将查询到的结果数据汇聚到协调节点
	
3- 由协调节点负责汇总数据,并且对数据进行排序操作,是全局降序排序

4- 最后将结果返回给到客户端

你可能感兴趣的:(elasticsearch,大数据,搜索引擎)