大聪明教你学Java | Elasticsearch 的核心概念与基础操作

前言

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情

🍊作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。

🍊支持作者: 点赞👍、关注💖、留言💌~

在上一篇博客中,我们讲了 Win10 环境下如何搭建 Elasticsearch,相信各位小伙伴都已经成功的搭建好了属于自己的 Elasticsearch,那么今天就和大家讲一下 Elasticsearch 中的一些基础操作,来帮助各位小伙伴快速入门。闲言少叙,我们直接进入正题。

🍊P.S. 如果还没有搭建自己的 Elasticsearch,可以参考大聪明教你学Java | Win10 环境下搭建 Elasticsearch

Elasticsearch 快速入门

🍓🍓Elasticsearch 的核心概念🍓🍓

Elasticsearch 中有几个核心概念需要我们知道,理解这些核心概念后会对整个学习过程有很大的帮助👇

🍎索引 Index🍎

索引可以有两方面的理解,首先是名词的理解,一个索引就是一个拥有相似特征的文档的集合(比如,你可以拥有学生信息的索引、课程信息的索引)。一个索引由一个名字来标识(命名时必须使用小写字母),当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。从动词方面去理解索引就是索引数据以及对数据进行索引的操作。

我们在启动 Elasticsearch 后,可以直接在浏览器访问 http://localhost:9200/_cat/indices?v (参数 v 是用来要求在结果中返回表头)来查看所有索引。如果页面只显示了一句“health status index uuid pri rep docs.count docs.deleted store.size pri.store.size”,则证明还未创建索引,那么我们可以通过 kibana(访问地址:http://127.0.0.1:5601/)来创建我们的第一个索引,如下图所示👇

在这里插入图片描述 PUT /test?pretty 代表我们需要创建一个名为 test 的索引,pretty 参数则是要求它返回一个漂亮的 json 结果,我们创建完成之后再通过上面的地址去查看全部索引就可以看到索引信息了~ 在这里插入图片描述 我们也可以通过 kibana 来查看索引信息👇

在这里插入图片描述

🍎节点(node)和集群(Cluster) 🍎

节点(node)是一个运行着的 Elasticsearch 实例,你可以认为是单个服务器。集群(cluster)是一个或多个节点的集合,他们协同工作,共享数据并提供故障转移和扩展功能。一个集群对应着一个唯一的名字标识(默认是“ElasticSearch”),一个节点只能通过指定某个集群的名字,来加入这个集群(所以这个名字是很重要的哦~)。

我们可以在浏览器中访问 http://localhost:9200/_cat/health?v 来查看当前集群的状态

在这里插入图片描述 集群的状态一共有三种值,分别是:

  • Green: 即最佳状态
  • Yellow: 即数据和集群可用,但是集群的备份有的是坏的
  • Red: 即数据和集群都不可用

同时,我们也可以通过访问 http://localhost:9200/_cat/nodes?v 来查看节点信息👇

在这里插入图片描述

🍎类型(TYPE) 🍎

在一个索引中,你可以定义一种或多种类型。一个类型对应着你的索引在一种逻辑上的分类,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。举个小例子,比如你运营着一个购物平台,并且你将所有的数据都存储到一个索引中,那么在这个索引中,你可以为用户数据定义一个类型,为商品数据定义另一个类型,也可以将订单数据定义成另一个类型。这就有点像在 Mysql 中建表一样,将同样类型的数据都放在同一个表中。

🍎文档(document) 🍎

一个文档是一个可被索引的基础信息单元(文档以 JSON 格式来表示),还是以上面的购物平台为例,你可以拥有某一个客户的文档,或者是某一种商品的文档。在一个索引或类型中可以存储任意多的文档。这就有点像 Mysql 中的某一张表可以拥有若干条数据一样。

🍎字段(Field) 🍎

相当于是 Mysql 中某张表所拥有的若干个字段,它可以对文档数据根据不同的属性进行分类标识。

🍎接近实时(NRT) 🍎

Elasticsearch 是一个接近实时的搜索引擎。这意味着,从索引一个文档到这个文档能够被搜索到会有一个轻微的延迟(通常是1秒)。

🍎 分片(shards)和复制(replicas) 🍎

一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有10亿文档的索引占据 1TB 的磁盘空间,然而任何一个节点都没有这么大的磁盘空间,或者是单个节点处理搜索请求的速度太慢,无法满足我们的需求。为了解决这个问题,Elasticsearch 提供了将索引划分成若干份的能力,这若干份就叫做分片。当你创建一个索引的时候,你可以指定你想要的分片的数量,每个分片本身也是一个功能完善并且独立的“索引”,这些“索引”可以被放置到集群中的任何节点上。在某一个运行环境中,失败随时都可能发生,比如某个分片或节点由于某些原因处于离线状态,或者由于某些原因消失不见了,那么此时就需要有一个故障转移机制。Elasticsearch同样帮我们解决了这个问题,Elasticsearch 允许我们创建某个分片的一份或多份拷贝,这些拷贝叫做复制分片(即复制),一旦我们复制了分片,那么每个索引就有了主分片(源分片)和复制分片(复制后的分片)之别。

分片和复制是相当重要的,分片允许我们水平分割或扩展内容容量,复制可以提高可用性,最重要的是分片和复制都可以有效的帮助我们提高性能、提升吞吐量。

🍎 映射(mapping) 🍎

mapping 是对处理数据的方式和规则方面做出的一些限制,如某个字段的数据类型、默认值、是否被索引等等,这些都是映射里面做出限制。在处理 Elasticsearch 里数据的一些使用规则的设置也叫做映射,建立出一个良好的映射,可以有效的提升我们在处理数据时的效率和性能。

🍓🍓Elasticsearch 的基础操作🍓🍓

上面我们讲了如何用 kibana 来创建索引、查询索引等操作,那么我们接下来再来看看关于 kibana 操作 Elasticsearch 的其他基础操作👇

🍌删除索引🍌

DELETE /test?pretty(test 即索引的名称,pretty 参数则是要求它返回一个漂亮的 json 结果)

🍌新增文档并建立索引🍌

//index指索引名、type指索引的类型、id是这条数据的id
PUT /index/type/id
{
  "json数据"
}
复制代码

咱们举个具体的例子👇

PUT /test/user/19960911
{
  "id": 19960911,
  "userId": "00001",
  "userName": "liziye"
}
复制代码

我们在 kibana 中执行一下上面的语句即可成功添加一个文档

在这里插入图片描述

🍌查询指定文档🍌

GET /test/user/19960911 (查询我们刚刚添加的那个文档)

在这里插入图片描述

🍌修改某个文档(全部修改) 🍌

//全部修改就是直接替换这个文档,必须带上所有的字段,才能对文档进行修改
PUT /test/user/19960911
{
  "id": 19960911,
  "userId": "00002",
  "userName": "liziye"
}

复制代码

在这里插入图片描述

🍌修改某个文档(部分修改) 🍌

POST /test/user/19960911/_update
{
    "doc":{
        "userId":"00003"
    }
}
复制代码

在这里插入图片描述

🍌查询全部文档 🍌

GET /test/user/_search

在这里插入图片描述 在返回的结果中包含了几个属性,我们这里对其简单解释一下:

  • took:耗费了几毫秒
  • timed_out:是否超时,这里是没有
  • _shards:数据拆成了5个分片
  • hits.total:查询结果的数量
  • hits.max_score:score的含义就是文档在本次搜索中的相关度分数,越相关,就越匹配,分数也就越高
  • hits.hits:匹配搜索的文档的详细数据

🍌分页查询全部文档🍌

GET /test/user/_search
{
  "query": { "match_all": {} },
  "from": 1,
  "size": 3
}
复制代码

在这里插入图片描述

🍌删除文档 🍌

DELETE /test/user/19960911

在这里插入图片描述

小结

本人经验有限,也是 Elasticsearch 的初学者,有些地方可能讲的没有特别到位,如果您在阅读的时候想到了什么问题,欢迎在评论区留言,我们后续再一一探讨🙇‍

希望各位小伙伴动动自己可爱的小手,来一波点赞+关注 (✿◡‿◡) 让更多小伙伴看到这篇文章~ 蟹蟹呦(●'◡'●)

如果文章中有错误,欢迎大家留言指正;若您有更好、更独到的理解,欢迎您在留言区留下您的宝贵想法。

爱你所爱 行你所行 听从你心 无问东西

分类:
后端