草庐IT

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

MCNU云原生 2023-03-28 原文

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

blog-thumb-release-endpoint-security.png

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、安装部署

  1. 下载Elasticsearch安装包

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

    $ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.0.tar.gz
    $ tar -zxvf elasticsearch-6.3.0.tar.gz
    
  2. 修改配置文件(可选)

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

    #集群名字,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: "*"
    
  3. 修改文件描述符和最大线程数限制

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

    * soft nofile 65536
    * hard nofile 131072
    * soft nproc 4096
    * hard nproc 4096
    

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

    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]
    
  4. 修改max_map_count参数

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

    vm.max_map_count=262144
    

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

    max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
    
  5. 关闭系统防火墙(可选)

    $ systemctl stop firewalld.service
    $ systemctl status firewalld.service
    
  6. 启动Elasticsearch

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

    $ bin/elasticsearch
    

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

    [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
    
  7. 验证Elasticsearch

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

    $ 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。

  1. 新建索引

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

    $ curl -X PUT "http://localhost:9200/customer?pretty"
    {
      "acknowledged":true,
      "shards_acknowledged":true
    }
    
  2. 查询索引

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

    $ curl -X GET "localhost:9200/my-index-000001?pretty"
    
  3. 删除索引

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

    $ curl -X DELETE "http://localhost:9200/customer?pretty"
    {
      "acknowledged": true
    }
    

04、文档操作

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

  1. 创建文档

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

    $ 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个分片,这是因为其中一个分片是副本分片,而本次实验的集群只是本地的一个节点,为了实现高可用,主分片和副本分片不会被分配到同一个节点上,所以这里副本分片没有被分配。

  2. 查询文档

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

    $ curl -X GET "http://localhost:9200/customer/_doc/1?pretty"
    {
      "_index": "customer",
      "_type": "_doc",
      "_id": "1",
      "_version": 2,
      "found": true,
      "_source": {
        "name": "Elastic Expert"
      }
    }
    
  3. 修改文档

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

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

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

    {
      "_index": "customer",
      "_type": "_doc",
      "_id": "1",
      "_version": 3,
      "result": "updated",
      "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
      },
      "_seq_no": 2,
      "_primary_term": 2
    }
    
  4. 删除文档

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

    $ curl -X DELETE "http://localhost:9200/customer/_doc/1?pretty"
    

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

    {
      "_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语法 。

    $ 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。

    $ curl -X GET "http://localhost:9200/customer/_search?q=*&pretty"
    

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

    {
      "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的核心功能吧。
更多干活文章,微信搜索“ElasticExpert”。

有关15分钟掌握Elasticsearch 8大核心概念与基础用法的更多相关文章

  1. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  2. 软件测试基础 - 2

    Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功

  3. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  4. ruby - 有人可以解释一下在 Ruby 中注入(inject)的真实、通俗易懂的用法吗? - 2

    我正在学习Ruby,遇到了inject。我正处于理解它的风口浪尖,但当我是那种需要真实世界的例子来学习一些东西的人时。我遇到的最常见的例子是人们使用inject来添加一个(1..10)范围的总和,我不太关心这个。这是一个任意的例子。在实际程序中我会用它做什么?我正在学习,所以我可以继续使用Rails,但我不必有一个以Web为中心的示例。我只需要一些我可以全神贯注的目标。谢谢大家。 最佳答案 inject有时可以通过它的“其他”名称reduce更好地理解。它是一个对Enumerable进行操作(迭代一次)并返回单个值的函数。它有许多有

  5. ruby - Rails Elasticsearch 聚合 - 2

    不知何故,我似乎无法获得包含我的聚合的响应...使用curl它按预期工作:HBZUMB01$curl-XPOST"http://localhost:9200/contents/_search"-d'{"size":0,"aggs":{"sport_count":{"value_count":{"field":"dwid"}}}}'我收到回复:{"took":4,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":90,"max_score":0.0,"hits":[]},"a

  6. ruby - 使用法拉第上传文件 - 2

    我在尝试使用Faraday将文件上传到网络服务时遇到问题。我的代码:conn=Faraday.new('http://myapi')do|f|f.request:multipartendpayload={:file=>Faraday::UploadIO.new('...','image/jpeg')}conn.post('/',payload)尝试发布后似乎没有任何反应。当我检查响应时this是我所看到的:#:post,:body=>#,#,@opts={}>,#],@index=0>>,#>],@ios=[#,#,@opts={}>,#],@index=0>,#],@index=0>

  7. ruby - rspec: raise_error 用法来匹配错误信息 - 2

    我使用raise(ConfigurationError.new(msg))引发错误我试着用rspec测试一下:expect{Base.configuration.username}.toraise_error(ConfigurationError,message)但这行不通。我该如何测试呢?目标是匹配message。 最佳答案 您可以使用正则表达式匹配错误消息:it{expect{Foo.bar}.toraise_error(NoMethodError,/private/)}这将检查NoMethodError是否由privateme

  8. 【网络】-- 网络基础 - 2

    (本文是网络的宏观的概念铺垫)目录计算机网络背景网络发展认识"协议"网络协议初识协议分层OSI七层模型TCP/IP五层(或四层)模型报头以太网碰撞路由器IP地址和MAC地址IP地址与MAC地址总结IP地址MAC地址计算机网络背景网络发展        是最开始先有的计算机,计算机后来因为多项技术的水平升高,逐渐的计算机变的小型化、高效化。后来因为计算机其本身的计算能力比较的快速:独立模式:计算机之间相互独立。    如:有三个人,每个人做的不同的事物,但是是需要协作的完成。    而这三个人所做的事是需要进行协作的,然而刚开始因为每一台计算机之间都是互相独立的。所以前面的人处理完了就需要将数据

  9. 三分钟集成 TapTap 防沉迷 SDK(Unity 版) - 2

    三分钟集成Tap防沉迷SDK(Unity版)一、SDK介绍基于国家对上线所有游戏必须增加防沉迷功能的政策下,TapTap推出防沉迷SDK,供游戏开发者进行接入;允许未成年用户在周五、六、日以及法定节假日晚上8:00-9:00进行游戏,防沉谜时间段进入游戏会弹窗进行提示!开发环境要求:Unity2019.4或更高版本iOS10或更高版本Android5.0(APIlevel21)或更高版本🔗Unity集成Demo参考链接🔗UnityTapSDK功能体验APK下载链接二、集成前准备1.创建应用进入开发者后台,按照提示开始创建应用;2.开通服务在使用TDS实名认证和防沉迷服务之前,需要在上面创建的应

  10. elasticsearch源码关于TransportSearchAction【阶段三】 - 2

    1.回顾.TransportServicepublicclassTransportServiceextendsAbstractLifecycleComponentTransportService:方法:1publicfinalTextendsTransportResponse>voidsendRequest(finalTransport.Connectionconnection,finalStringaction,finalTransportRequestrequest,finalTransportRequestOptionsoptions,TransportResponseHandlerT>

随机推荐