一、简介
Elasticsearch 是一个高度可扩展的开源全文搜索和分析引擎。它允许您快速,近实时地存储,搜索和分析大量数据。它通常用作底层引擎、技术,为具有复杂搜索功能和要求的应用程序提供支持。
Elasticsearch 也使用 Java 开发并使用 Lucene 作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。
ES 是基于Lucene这个非常成熟的索引方案,另加上一些分布式的实现:集群,分片,复制等。
特点:
- 分布式实时文件存储、检索、分析
- 零配置、集群自动发现
- 索引自动分片、副本机制
- RESTful风格接口
- 多数据源
- 自动搜索负载
二、ES分布式架构
上图信息:
节点数量:3
索引名称:demo
一个节点的分片数量(number_of_shards):2
副分片数量(number_of_replicas):2
主分片和副分片:
-
当新建一个索引库时,可以预先设置其会被分为N个分片(主分片),同时可以为每个主分片产生N个备份分片(副分片)。
-
N个主分片随机分布在集群的多个节点中;N个副分片也是随机的分布在集群的多个节点中,但是副分片和其主分片不会在一个节点上。
1.写(添加数据)
1.客户端向主节点NODE1发送索引文档请求
2.主节点NODE1根据文档的_id来进行路由计算算出该文档属于P0分片,分配到NODE3的主分片P0上
3.NODE3的主分片P0将存入的数据备份到P0的备用节点P1、P2上。
4.当P0所有的Replicas副分片报告成功后,Node3向请求的主节点Node1发送成功报告,Node1再报告至Client。
2.读Get
【注】一个文档可以在primary shard(主分片)和所有的replica shard(副分片)上读取。
1.客户端对主节点NODE1发起Get请求
2.NODE1使用文档的_id找出它所在的分片是shard0,shard0的主分片P0及副分片R0都保存着_id的数据,所以不管从哪里读都可以,所以随机去找shard0分片,这次找到的shard0是NODE2的R0副分片
3.NODE2将R0查询的结果返回给NODE1,NODE1将查询的文档返回给客户端
3.跟新
4.搜索数据过程query(其实是协调节点(主节点)在做)
1.客户端发送一个请求给协调节点
2.协调节点将搜索的请求转发给所有的shard对应的primary shard(主分片)
3.query phase:每一个shard 将自己搜索的结果(其实也就是一些唯一标识),返回给协调节点,有协调节点进行数据的合并,排序,分页等操作,产出最后的结果
4.fetch phase ,接着由协调节点,根据唯一标识_id去各个节点进行拉去数据(使用倒排数据),最终返回给客户端
三、es增删改查
几个关键字:
put 增加/更新
update 改变
delete 删除
get 查询
post 查询/改变
head 改变/删除
一下用例都是在def索引、stu类型下
- 增
单行插入
put
PUT /def/stu/1
{"id": 1, "studentNo": "TH-CHEM-2016-C001", "name": "Jonh Smith", "major":"Chemistry", "gpa": 4.8, "yearOfBorn": 2000, "classOf": 2016, "interest": "soccer, basketball, badminton, chess"}
post:添加数据如果写_id且该_id存在那么就是替换原来的文本内容,如果_id不存在那么就是添加新数据。如果不写_id那么系统会自动添加一个数据,且系统自动创建一个_id
POST /def/stu/2
{"id":"110","name":"xiaowang","intresting":"football"}
批量插入_bulk
【注】语句需要写在一行中,用大括号{}包裹住
POST /_bulk
{"create":{"_index":"def","_type":"stu","_id":"2"}}
{"id": 2, "studentNo": "TH-PHY-2018-C001", "name": "Isaac Newton", "major":"Physics", "gpa": 3.6, "yearOfBorn": 2001, "classOf": 2018, "interest": "novel, soccer, cooking"}
{"create":{"_index":"def","_type":"stu","_id":"3"}}
{"id": 3, "studentNo": "BU-POLI-2016-C001", "name": "John Kennedy", "major":"Politics", "gpa": 4.2, "yearOfBorn": 2000, "classOf": 2016, "interest": "talking, dating, boxing, shooting, chess"}
{"create":{"_index":"def","_type":"stu","_id":"4"}}
{"id": 4, "studentNo": "BU-POLI-2015-C001", "name": "John Kerry", "major":"Politics", "gpa": 4.1, "yearOfBorn": 1999, "classOf": 2015, "interest": "money, basketball"}
{"create":{"_index":"def","_type":"stu","_id":"5"}}
{"id": 5, "studentNo": "BU-ARTS-2016-C002", "name": "Da Vinci", "major":"Arts", "gpa": 4.8, "year
- 删
删除索引
DELETE /索引名
删除数据
DELETE /def/stu/110
- 该
POST /索引/类型/_id/_update
{
"doc":{
列名:值//精准修改其中某个列
}
}
- 查
_source:根据_id查询信息