前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >15分钟掌握Elasticsearch 8大核心概念与基础用法

15分钟掌握Elasticsearch 8大核心概念与基础用法

作者头像
MCNU云原生
发布2023-02-22 10:18:15
7110
发布2023-02-22 10:18:15
举报
文章被收录于专栏:MCNU云原生

Elastic 已经形成了一个较为庞大的生态,这个生态的核心就是 Elasticsearch。初学者的重点就是如何快速地了解并使用 Elasticsearch,本文总结了 Elasticsearch 的 8 大核心概念和安装、用法,15 分钟实现入门并且掌握 Elasticsearch 的简单使用。

01、核心概念

  • 索引(index) 一个索引是一些具有相似特征的文档的集合,例如一个用户信息的索引,一个学生成绩的索引,一个索引在 Elasticsearch 中由一个名字指定,名字由小写字母组成。在 Elasticsearch 一般为某一类的数据就存储在某一个特定的索引中。
  • 类型(type) 在一个索引中,可以定义一种或者多种类型,类型指的是一个索引上的逻辑分类,一般来说会为一组具有共同字段的文档定义类型,例如保存一个保存用户数据的索引,为会员用户创建一个类型,为普通用户创建一个类型。类型在 Elasticsearch 7.X 版本以后已经被去掉了。
  • 文档(document) 一个文档是可以被 Elasticsearch 索引的基础信息单元,文档以通用的数据交换格式 JSON 表示,存储于索引之中,理论上一个索引中可以存储任意多的文档。
  • 分片(shards) 一个索引理论上可以存放任意多的文档,但是实际情况下单台服务器的容量有限,无法存放所有的数据。例如 100 亿的文档,单台服务器存储不下。为了解决这种情况,Elasticsearch 提供了将一个索引的数据切分成多份存放到多个服务器的功能,每一份就是一个分片。在创建索引的时候可以指定分片的数量,默认会有 5 个分片。一般来说指定以后不能更改(更改的代价太大),索引需要提前进行容量的规划。分片的设计一方面让 Elasticsearch 具备了水平扩展的能力,另一方面多个分片可以并行提供查询和索引服务,大大提高系统的性能。
  • 复制(replicas) 一个健壮的系统必须具备高可用性,复制就是 Elasticsearch 高可用性的体现。当某一个分片出现问题掉线的情况下,必须要有一个"备份"可以进行故障转移,这个备份就是"复制"分片。Elasticsearch 允许对某一个主分片创建多个复制分片,默认为 1 个复制分片。特别需要注意的是,复制分片不能与主分片在同一个节点,否则就失去了高可用的能力。综上,复制分片的作用:
    • 提供 Elasticsearch 的高可用性
    • 多个复制分片并行提供搜索功能,提升 Elasticsearch 的搜索能力。
  • 集群(cluster) Elasticsearch 集群由一个或者多个节点组成,共同承担所有的数据存储和搜索功能。集群由一个唯一的名字进行区分,默认为"elasticsearch",集群中的节点通过整个唯一的名字加入集群。
  • 节点(node) 节点是 Elasticsearch 集群的一部分,每个节点也有一个唯一的名称,只要多个节点在同个网络中,节点就可以通过指定集群的名称加入某个集群,与集群中的其他节点相互感知。
  • 近实时(near real-time) Elasticsearch 从存储文档到文档可以被索引查询会存在短暂的延时,延时时间一般在 1 秒以内,所以一般称其为近实时。

02、安装部署

下载 Elasticsearch 安装包

下载 Elasticsearch 安装包,并解压缩,本文以 6.3.0 版本为例。

代码语言:javascript
复制
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.0.tar.gz
$ tar -zxvf elasticsearch-6.3.0.tar.gz

修改配置文件(可选)

修改配置文件是可选的一个步骤,只是为了向大家展示 Elasticsearch 一些基本的配置项,大家可以选择性配置,亦可以跳过使用默认配置。

代码语言:javascript
复制
#集群名字,elasticsearch使用集群名字来加入某一个集群,默认为elasticsearch
cluster.name: my-application
#节点名字
node.name: node-1
node.attr.rack: r1
#数据存放路径
path.data: /home/elastic/data
#日志存放路径
path.logs: /home/elastic/logs
#对外发布的IP
network.host: 192.168.56.11
#http访问的端口
http.port: 9200
#是否开启xpack安全配置
xpack.security.enabled: false
#添加跨域配置
http.cors.enabled: true
http.cors.allow-origin: "*"

修改文件描述符和最大线程数限制

切换到 root 用户,修改/etc/security/limits.conf 配置文件,添加以下内容并保存。

代码语言:javascript
复制
* soft nofile 65536
* hard nofile 131072
* soft nproc 4096
* hard nproc 4096

以上的配置是因为 ElasticSearch 的运行对最大的文件描述符以及最大线程数有要求,默认值 4096 和 2048 太小了,若无以上配置,启动过程中会报如下错误。

代码语言:javascript
复制
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
[1]: max number of threads [2048] for user [elastic] is too low, increase to at least [4096]

修改 max_map_count 参数

打开/etc/sysctl.conf 配置文件,添加如下内容并保存,执行sysctl -p命令生效。

代码语言:javascript
复制
vm.max_map_count=262144

以上的配置也是因为 Elasticsearch 对虚拟内存空间有一定的要求,设置太小启动将会报如下错误

代码语言:javascript
复制
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

关闭系统防火墙(可选)

代码语言:javascript
复制
$ systemctl stop firewalld.service
$ systemctl status firewalld.service

启动 Elasticsearch

经过以上配置,就可以执行以下命令启动 Elasticsearch,进入 Elasticsearch 根目录,执行以下命令

代码语言:javascript
复制
$ bin/elasticsearch

如果看到以下日志,代表已经正常启动

代码语言:javascript
复制
[2019-01-13T08:41:29,796][INFO][c.f.s.h.SearchGuardHttpServerTransport] [node-1] publish_address {10.0.2.15:9200}, bound_addresses {[::]:9200}
[2019-01-13T08:41:29,796][INFO ][o.e.n.Node               ] [node-1] started

验证 Elasticsearch

Elasticsearch 支持标准的 HTTP 协议,支持 Restful API,在 Linux 下我们可以使用 curl 命令或者在浏览器输入如下 URL,若有正常输出 Elasticsearch 集群信息,证明已经正常运行。

代码语言:javascript
复制
$ curl -X GET http://localhost:9200
{
  "name" : "node-1",
  "cluster_name" : "my-application",
  "cluster_uuid" : "C2ILS_NVRM-S-JPFFsHhUg",
  "version" : {
    "number" : "6.3.0",
    "build_flavor" : "default",
    "build_type" : "zip",
    "build_hash" : "424e937",
    "build_date" : "2018-06-11T23:38:03.357887Z",
    "build_snapshot" : false,
    "lucene_version" : "7.3.1",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

03、索引操作

Elasticsearch 提供一整套的 Rest API 用以支持各种索引、文档、搜索等操作。这里我们简单以索引的创建、查询和删除为例子来了解如何操作 Elasticsearch。

新建索引

在 Elasticsearch 中,文档存储在索引中,查询也是从索引中查询,可以类比为传统关系数据库中的数据库(这个比喻不太准确,但有助于初始的理解)。以下使用标准的 HTTP PUT 方法发起创建索引的请求来新建一个索引,如下创建一个名字为 customer 的索引,pretty 参数表示 response 以方便读取的 JSON 格式返回,返回值如下,表示索引已经创建成功。

代码语言:javascript
复制
$ curl -X PUT "http://localhost:9200/customer?pretty"
{
  "acknowledged":true,
  "shards_acknowledged":true
}

查询索引

同样地使用 HTTP GET 方法向 Elasticsearch 集群查询在步骤一已经创建的索引

代码语言:javascript
复制
$ curl -X GET "localhost:9200/my-index-000001?pretty"

删除索引

同样地,使用 HTTP DELETE 方法可以删除一个索引,一旦删除了某个索引,这个索引下所有的分片、文档都会被删除,这是一个需要非常慎重的操作。 当看到以下的返回值时,代表已经删除成功。也可以重新使用索引查询方法进行查询,可以发现已经查询不到此索引。

代码语言:javascript
复制
$ curl -X DELETE "http://localhost:9200/customer?pretty"
{
  "acknowledged": true
}

04、文档操作

Elasticsearch 中的数据以文档 document 的形式存储在索引中,Elasticsearch 提供了一系列的_doc Rest API用来操作 document 的增删改查,下面以已经创建的 customer 索引为基础,实践一下对于 Elasticsearch 中 document 的操作。

创建文档

使用 HTTP PUT 方法可以往索引中新建一个 document,如下请求为创建一个新的 document,存储在 customer 索引下,指定了其 document id 为 1,如果不指定的话 Elasticsearch 会自动生成一个 id。

代码语言:javascript
复制
$ curl -X PUT "http://localhost:9200/customer/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
  "name": "Elastic Expert"
}
'
{
  "_index": "customer",
  "_type": "_doc",
  "_id": "1",
  "_version": 2,
  "result": "updated",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 1,
  "_primary_term": 2
}

如果创建成功, 会返回如下的响应信息,其中"index"指明了索引名称,"version"代表了文档的版本,shards"指明了本次操作涉及 2 个分片,"successful"代表创建文档的操作成功的只有 1 个分片,这是因为其中一个分片是副本分片,而本次实验的集群只是本地的一个节点,为了实现高可用,主分片和副本分片不会被分配到同一个节点上,所以这里副本分片没有被分配。

查询文档

使用 HTTP GET 方法,可以通过 document id 查询 document,返回值如下,可以发现实际存储的内容放在了 source 字段。

代码语言:javascript
复制
$ curl -X GET "http://localhost:9200/customer/_doc/1?pretty"
{
  "_index": "customer",
  "_type": "_doc",
  "_id": "1",
  "_version": 2,
  "found": true,
  "_source": {
    "name": "Elastic Expert"
  }
}

修改文档

使用 HTTP POST 请求修改一个 document,例如使用_update API 将上一步骤创建的 document name 的值改为“Test Name” 。

代码语言:javascript
复制
$ curl -X POST "http://localhost:9200/customer/_doc/1/_update?pretty" -H 'Content-Type:application/json' -d'
{
  "doc": { "name": "New Elastic Expert" }
}'

返回值如下,可以发现_version 字段的值已经改变了,证明我们的更新成功了,当然,也可以使用查询 API 重新查询确认。

代码语言:javascript
复制
{
  "_index": "customer",
  "_type": "_doc",
  "_id": "1",
  "_version": 3,
  "result": "updated",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 2,
  "_primary_term": 2
}

删除文档

使用 HTTP DELETE 方法,通过指定 document id 可以删除对应的 document 。返回值如下代表删除成功

代码语言:javascript
复制
$ curl -X DELETE "http://localhost:9200/customer/_doc/1?pretty"

返回值中"result"的值为"deleted"代表已经删除成功,值得一提的是,在 Elasticsearch 中,删除的文档不是直接从物理上立刻删除,而是标记为删除,等待一个时机到来以后才会真实地从物理上进行删除。

代码语言:javascript
复制
{
  "_index": "customer",
  "_type": "_doc",
  "_id": "1",
  "_version": 4,
  "result": "deleted",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 3,
  "_primary_term": 2
}

05、数据搜索

我们已经掌握了 Elasticsearch 创建索引,增加和更新文档的操作,下来就是重头戏搜索。Elasticsearch 天生具备搜索的强支持能力,与 document、index 一样,有一套专门的_search API 来支持搜索功能,还有很多的搜索特性,不同的搜索类型,搜索功能较为复杂。在本小节只介绍最简单的搜索 API,以期能快速进入 Elasticsearch 搜索的大门。

数据搜索基本使用 HTTP GET 方法,_search API 根据查询参数的位置的不同支持两种形式:

搜索参数放在 request body

将 query 参数放在 HTTP 请求的 request body 中发起查询,匹配条件指定为 match_all 代表匹配所有的文档,这种查询方式使用的是 Elasticsearch 的 query DSL 语法 。

代码语言:javascript
复制
$ curl -X GET "http://localhost:9200/customer/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "query": { "match_all": {} }
}
'

搜索参数放在 request uri

查询参数放在 HTTP 请求的 request uri 上作为 query parameter,q=*使用模糊匹配的方式,代表查询 customer 索引下所有的 document。

代码语言:javascript
复制
$ curl -X GET "http://localhost:9200/customer/_search?q=*&pretty"

返回值如下,shards.total 代表总共 5 个分片,shards.successful 为 5 代表 5 个分片全部成功进行了查询,hits 段代表查询的结果,hits.total 为 1 代表符合条件的 document 数量为 1。

代码语言:javascript
复制
{
  "took": 17,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1.0,
    "hits": [
      {
        "_index": "customer",
        "_type": "_doc",
        "_id": "2",
        "_score": 1.0,
        "_source": {
          "name": "Elastic Expert"
        }
      }
    ]
  }
}

经过以上的实践,相信基本上可以简单的掌握 Elasticsearch 的基础用法以及对相关的核心概念都有了一定的认识,接下来跟我一起深入学习 Elasticsearch 的核心功能吧。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MCNU云原生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 01、核心概念
  • 02、安装部署
  • 03、索引操作
  • 04、文档操作
  • 05、数据搜索
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档