aa126b96881511ebb6edd017c2d2eca2

ES概述

ElasticSearch是一个分布式,高性能、高可用、可伸缩、RESTful 风格的搜索和数据分析引擎。通常作为Elastic Stack的核心来使用,Elastic Stack大致是如下这样组成的:

在这里插入图片描述

ES是一个近实时(NRT)的搜索引擎,一般从添加数据到能被搜索到只有很少的延迟(大约是1s),而查询数据是实时的。一般我们可以把ES配合logstash,kibana来做日志分析系统,或者是搜索方面的系统功能,比如在网上商城系统里实现搜索商品的功能也会用到ES。

ES与Mysql的概念对比

ESMySql
字段
文档一行数据
类型(已废弃)
索引数据库

ES面向文档

文档是所有可搜索数据的最小单元。ES的文档就像MySql中的一条记录,只是ES的文档会被序列化成json格式,保存在Elasticsearch中

  • 这个json对象是由字段组成,字段就相当于Mysql的列,每个字段都有自己的类型(字符串、数值、布尔、二进制、日期范围类型);

  • 当我们创建文档时,如果不指定字段的类型,Elasticsearch会帮我们自动匹配类型;

  • 每个文档都有一个ID,类似MySql的主键,咱们可以自己指定,也可以让Elasticsearch自动生成;

类型Type

7.0版本开始,一个索引就只能创建一个类型了(_doc)

索引(Index)

索引就相当于MySql里的数据库,它是具有某种相似特性的文档集合。反过来说不同特性的文档一般都放在不同的索引里;
索引的名称必须全部是小写
在单个集群中,可以定义任意多个索引;
索引具有mappingsetting的概念,mapping用来定义文档字段的类型setting用来定义不同数据的分布


分片(shard)

ES提供了将索引细分为多个碎片的功能,这就是分片。这里咱们可以简单去理解,在创建索引时,只需要咱们定义所需的碎片数量就可以了,其实每个分片都可以看作是一个完全功能性和独立的索引,可以托管在集群中的任何节点上。

  1. 通过分片技术,咱们可以水平拆分数据量,同时它还支持跨碎片(可能在多个节点上)分布和并行操作,从而提高性能/吞吐量;
  2. ES可以完全自动管理分片的分配和文档的聚合来完成搜索请求,并且对用户完全透明;
  3. 主分片数在索引创建时指定,后续只能通过Reindex修改,但是较麻烦,一般不进行修改。

副本分片(replica shard)

遇到问题时实现分片的故障转移机制,ElasticSearch允许将索引分片的一个或多个复制成所谓的副本分片。

ES 与RESTful 风格

RESTful 的四个关键词:PUT(修改),POST(添加),DELETE(删除),GET(查询)。其中在ES里面PUT和POST的界限并不是很分明,有时候PUT也作为添加。

索引的基本操作(CRUD)

创建索引

PUT /ropledata
{
"settings": {
"number_of_shards": "2",
"number_of_replicas": "0"
}
}

image-20211004022427855

删除索引

DELETE /datatest

image-20211004022446417

删除索引成功

修改副本

咱们如果对刚才创建的索引副本数量不满意,可以进行修改,注意:分片不允许修改

PUT ropledata/_settings 
{
"number_of_replicas" : "2"
}

插入数据

创建一个文档 (即插入一行数据)

POST /ropledata/_doc/101 
{
"id":1,
"name":"风离的博客",
"page":"https://flya.top/",
"say":"风离的博客"
}

image-20211004022800512

修改数据

ES里的文档是不可以修改的,但是可以覆盖,所以ES修改数据本质上是对文档的覆盖。ES对数据的修改分为全局更新局部更新

全局更新

image-20211004022930078

局部更新

局部更新 version+1 (现在局部更新好像每次都会更新Version了)

image-20211004023030144

局部更新的底层流程:

内部先获取到对应的文档;
将传递过来的字段更新到文档的json中(这一步实质上也是一样的);
将老的文档标记为deleted(到一定时候才会物理删除);
将修改后的新的文档创建出来。
性能对比:

全局更新本质上是替换操作,即使内容一样也会去替换;
局部更新本质上是更新操作,只有遇到新的东西才更新,没有新的修改就不更新;
局部更新比全局更新的性能好,因此推荐使用局部更新。


版权声明:本文为CSDN博主「且听_风吟」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_26803795/article/details/106423578

*查询数据**(By Id)

image-20211004023949052

删除数据(By Id)

image-20211004024043088

查询或者删除的时候指定的ID是文档里面得字段id吗?(就是你刚创建的时候的那个id)

不是的,这点容易混淆,查询或者删除时候用到的ID是创建文档时候指定或者ES自动生成的那个id,而不是文档里面的那个叫id 字段!文档里面的文档字段是可以没有id 的。