zoukankan      html  css  js  c++  java
  • Elasticsearch 别管原理,先run起来

    少点代码,多点头发

    本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。

    https://github.com/midou-tech/articles

    看文章有两点需要注意:

    • 本公号讲解的Elasticsearch是基于7.7.0版本,你们在阅读一些相关书籍和博客注意版本,不同版本很多概念会有出入。

    • 文章写作过程中会经常将Elasticsearch简写为Es,阅读过程中需要注意。

    一般学习一个新的技术或者产品,第一步就是用起来。什么设计理论,框架源码,都别和我谈,先run起来。这也是在公司看别人项目的绝招。

    用起来,有一个很明显的点,是你能感受到他,不然天天看理论知识,看源码会让你觉得你好像懂了,但又心里没底,最终会导致你走火入魔。

    今天龙叔的主题就是 学Es,先run起来,用起来之后在去探索内部更多问题和原理。

    Elasticsearch
    Elasticsearch

    Elasticsearch安装

    Elasticsearch 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elasticsearch 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。

    Elasticsearch 需要 Java 8 环境。如果你的机器还没安装 Java,可以在网上找个教程安装,注意要保证环境变量JAVA_HOME正确设置。

    安装完 Java,就可以跟着 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/zip-targz.html 安装 Elasticsearch。我这里就直接下载压缩包比较简单。

    #mac和linux上安装教程一样的
    # 下载
    $ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.7.0-darwin-x86_64.tar.gz
    $ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.7.0-darwin-x86_64.tar.gz.sha512
    $ shasum -a 512 -c elasticsearch-7.7.0-darwin-x86_64.tar.gz.sha512 
    #解压
    $ tar -xzf elasticsearch-7.7.0-darwin-x86_64.tar.gz
    $ cd elasticsearch-7.7.0/
    

    接着,进入解压后的目录,运行下面的命令,启动 Elasticsearch。

    $ ./bin/elasticsearch
    

    如果一切正常,那可能是run起来了,Es默认打开9200端口。测试下是否启动成功,用 curl 工具测试(这个工具后面会写一篇文章介绍,还有上面用的wget),也可以在浏览器访问。

    $ curl localhost:9200 #测试命令
    {
      "name" : "MacBook-Pro.local",
      "cluster_name" : "elasticsearch",
      "cluster_uuid" : "Z1NxCjE4T6CgTjZmpAVe_A",
      "version" : {
        "number" : "7.7.0",
        "build_flavor" : "default",
        "build_type" : "tar",
        "build_hash" : "81a1e9eda8e6183f5237786246f6dced26a10eaf",
        "build_date" : "2020-05-12T02:01:37.602180Z",
        "build_snapshot" : false,
        "lucene_version" : "8.5.1",
        "minimum_wire_compatibility_version" : "6.8.0",
        "minimum_index_compatibility_version" : "6.0.0-beta1"
      },
      "tagline" : "You Know, for Search"
    }
    

    请求9200端口,Elastic 返回一个 JSON 对象,包含当前节点、集群、版本等信息。

    收到这样一个JSON对象,说明启动成功。

    安装整体没什么压力,java环境装好,基本就是开箱即用。程序员最喜欢使用这样的中间件,开箱即用,从不管箱子里面是啥。

    基本概念

    本来run起来就准备说搞点数据进去,在和Es进行交互起来,但是正在准备写数据进索引的时候,发现不对劲。

    可能有人根本不知道什么是索引?什么Document。于是 就来了,先普及下基本概念。

    节点(Node) 与集群( Cluster)

    Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。

    单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)。

    索引(Index)

    Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index),也经常称之为倒排索引。查找数据的时候,直接查找该索引。

    Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。

    文档(Document)

    Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。

    写点数据进Es

    基本概念已经有了,知道查找是通过倒排索引进行的,所以数据肯定是存放在索引里面的。

    我们现在要写数据进Es,其实就是把数据写到Es的索引(index)中,前面已经把Es启动起来了,并没有创建索引。

    今天写数据就不写代码了,利用ES的一些封装很好的接口,直接命令行操作,后期在用代码写数据进Es。

    先创建一个index ,使用curl 工具在命令行操作,这是一个put请求。

    $curl -X PUT 'localhost:9200/user'
    

    查看索引是否以及创建成功

    $ curl -X GET 'http://localhost:9200/_cat/indices?v'
    

    这个get请求可以查看当前节点的所有索引

    妥妥的已经创建成功

    顺便说下,删除一个索引的命令,DELETE参数表示删除

    $curl -X DELETE 'localhost:9200/user'
    

    到这里索引已经创建好了,可以写点数据进去了。使用接口 /index/_doc/id ,/索引名/_doc/doc_id

    $ curl -X PUT -H 'Content-Type: application/json' 'localhost:9200/user/_doc/1' -d '
    {
      "name": "龙跃十二",
      "title": "工程师",
      "desc": "一个分享互联网技术和心路历程的star"
    }'
    

    查看当前索引下的所有数据

    $ curl 'localhost:9200/user/_search?pretty=true
    

    到这里基本我们已经可以写数据到指定索引了,生产场景不会这么写数据的,都是用代码写海量数据进ES的,这就几条数据也没什么搜索性能可谈的。

    我之前工作中日志数据都是TB级别的写到Es中,当遇到这种数据量的搜索时才会感受到搜索引擎的魅力,才会意识到Es的重要性。

    这里主要是练手和跑通流程,所以造了一些数据到Es中

    和ES进行交互

    其实写数据进Es已经是一种交互了,在讲一些其他的交互接口

    目前讲的交互方式主要是通过原生的请求的方式,还没有上升到界面操作,后期在学习的过程中会展现出来。

    查询交互

    使用 GET 方法,直接请求/Index/_search,就会返回所有记录。

    $ curl 'localhost:9200/user/_search?pretty=true'
    {
      "took" : 1,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 3,
          "relation" : "eq"
        },
        "max_score" : 1.0,
        "hits" : [
          {
            "_index" : "user",
            "_type" : "_doc",
            "_id" : "1",
            "_score" : 1.0,
            "_source" : {
              "name" : "龙跃十二",
              "title" : "工程师",
              "desc" : "一个分享互联网技术和心路历程的star"
            }
          },
          {
            "_index" : "user",
            "_type" : "_doc",
            "_id" : "3",
            "_score" : 1.0,
            "_source" : {
              "name" : "三y",
              "title" : "工程师",
              "desc" : "只有光头才能变得更强"
            }
          },
          {
            "_index" : "user",
            "_type" : "_doc",
            "_id" : "2",
            "_score" : 1.0,
            "_source" : {
              "name" : "敖丙",
              "title" : "工程师",
              "desc" : "一个互联网苟且偷生的工具人"
            }
          }
        ]
      }
    }
    
    

    上面代码中,返回结果的 took字段表示该操作的耗时(单位为毫秒),timed_out字段表示是否超时,hits字段表示命中的记录,里面子字段的含义如下。

    • total:返回记录数,本例是2条。
    • max_scor:最高的匹配程度,本例是1.0。
    • hits:返回的记录组成的数组。

    返回的记录中,每条记录都有一个_score字段,表示匹配的程序,默认是按照这个字段降序排列。

    Es的查询语法还有很多,后面在结合实战项目的时候会讲解其他语法,你也可以看下官网语法介绍 官网查询语法

    数据操作交互

    新增一条doc记录的语法示例如下,可以不用指定doc_id的,Es会默认有一个doc_id。

    $ curl -X PUT -H 'Content-Type: application/json' 'localhost:9200/user/_doc/2' -d '
    {
      "name": "敖丙",
      "title": "工程师",
      "desc": "一个互联网苟且偷生的工具人"
    }'
    

    删除一条doc记录的语法是 /Index/_doc/doc_id

    $ curl -X DELETE  'localhost:9200/user/_doc/1'
    

    更新一条记录的语法示例

    $ curl -X PUT -H 'Content-Type: application/json' 'localhost:9200/user/_doc/2' -d '
    {
      "name": "三太子敖丙",
      "title": "工程师",
      "desc": "一个互联网苟且偷生的工具人"
    }'
    

    总结一下

    本篇文章,我们把Es从官网下载下来,可以run起来,可以写数据进去,可以查询,学习了一些简单的交互语法。

    当然Es的魅力不在于此,Es的魅力之一在于可以对海量数据进行高效的检索。

    下篇文章出一个关于Es的写作大纲,方便大家在看的过程中有一个整理的轮廓。

    Es整个知识点我也是边学边写,有什么不对的地方,还希望大佬们尽管指出来。

    龙跃十二
    龙跃十二
  • 相关阅读:
    Spring IOC容器基于配置文件装配Bean(5) ------通过工厂方法配置bean
    Spring IOC容器基于配置文件装配Bean(4) ------bean生命周期
    Spring IOC容器基于配置文件装配Bean(3) ------装配集合属性
    Spring IOC容器基于配置文件装配Bean(2) ------通过setter或构造方法注入
    Spring IOC容器基于配置文件装配Bean(1) ------设置autowire自动装配
    Java实现序列化的作用和目的
    静态语言与动态语言
    C# WinForm 界面控件
    C# 中类与继承等概念
    C# 中的函数与方法
  • 原文地址:https://www.cnblogs.com/zhonglongbo/p/13070181.html
Copyright © 2011-2022 走看看